From da91bdae5cb6ecf0cdbbf8acef9bdc08217a0ff8 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Mon, 18 Mar 2024 21:14:31 +0000 Subject: [PATCH] release PHP 7.2 downgraded --- .editorconfig | 9 - .../workflows/bare_run.yaml | 0 .gitignore | 4 - bin/rule-doc-generator | 3 +- bin/rule-doc-generator.php | 16 +- build/build-scoped.sh | 52 - build/rector-downgrade-php-72.php | 15 - build/target-repository/.github/FUNDING.yml | 3 - build/target-repository/composer.json | 11 - composer.json | 44 +- composer.lock | 3278 ++++++++++++ ecs.php | 13 - full-tool-build.sh | 18 - php-scoper.phar | Bin 0 -> 1197968 bytes phpstan.neon | 13 - phpunit.xml | 6 - prefix-code.sh | 47 - rector.php | 33 - scoper.php | 26 - src/Command/GenerateCommand.php | 81 +- src/DependencyInjection/ContainerFactory.php | 51 +- src/DirectoryToMarkdownPrinter.php | 93 +- src/Exception/ConfigurationBoundException.php | 4 +- src/Exception/ShouldNotHappenException.php | 4 +- src/FileSystem/ClassByTypeFinder.php | 27 +- src/FileSystem/PathsHelper.php | 17 +- .../BadGoodCodeSamplePrinter.php | 26 +- .../CodeSamplePrinter/CodeSamplePrinter.php | 59 +- .../DiffCodeSamplePrinter.php | 24 +- src/Printer/Markdown/MarkdownCodeWrapper.php | 19 +- src/Printer/Markdown/MarkdownDiffer.php | 47 +- src/Printer/NeonPrinter.php | 17 +- src/Printer/RuleDefinitionsPrinter.php | 84 +- .../ECSRuleCodeSamplePrinter.php | 38 +- .../PHPStanRuleCodeSamplePrinter.php | 61 +- .../RectorRuleCodeSamplePrinter.php | 25 +- src/RuleDefinitionsResolver.php | 25 +- src/Text/KeywordHighlighter.php | 110 +- src/ValueObject/Option.php | 6 +- src/ValueObject/RuleClassWithFilePath.php | 27 +- tests/AbstractTestCase.php | 28 - .../DirectoryToMarkdownPrinterTest.php | 47 - .../php-cs-fixer/phpcsfixer_content.md | 14 - .../phpstan/configurable_phpstan_content.md | 36 - .../Expected/phpstan/phpstan_content.md | 23 - .../composer_json_aware_rector_content.md | 0 .../rector/configurable_rector_content.md | 0 .../Expected/rector/rector_categorized.md | 37 - .../Expected/rector/rector_content.md | 27 - .../Fixture/PHPCSFixer/Standard/SomeFixer.php | 42 - .../PHPStan/Configurable/SomePHPStanRule.php | 51 - .../PHPStan/Standard/SomePHPStanRule.php | 36 - .../Configurable/ConfigurableRector.php | 33 - .../DirectConfiguredStringKeyRector.php | 32 - .../Configurable/WithPHPStanTypeObject.php | 43 - .../Fixture/Rector/Standard/SomeRector.php | 37 - .../SomeWhiteSpaceCodeSampleRector.php | 39 - .../Source/SomeValueObjectWrapper.php | 15 - tests/Fixture/StaticFixtureUpdater.php | 51 - .../MarkdownDiffer/Fixture/expected_diff.txt | 4 - tests/MarkdownDiffer/MarkdownDifferTest.php | 19 - tests/Text/KeywordHighlighterTest.php | 42 - vendor/autoload.php | 25 + vendor/bin/yaml-lint | 94 + vendor/composer/ClassLoader.php | 579 +++ vendor/composer/InstalledVersions.php | 313 ++ vendor/composer/LICENSE | 21 + vendor/composer/autoload_classmap.php | 421 ++ vendor/composer/autoload_files.php | 15 + vendor/composer/autoload_namespaces.php | 9 + vendor/composer/autoload_psr4.php | 24 + vendor/composer/autoload_real.php | 51 + vendor/composer/autoload_static.php | 530 ++ vendor/composer/installed.json | 1456 ++++++ vendor/composer/installed.php | 5 + vendor/composer/platform_check.php | 26 + vendor/illuminate/container/BoundMethod.php | 170 + vendor/illuminate/container/Container.php | 1287 +++++ .../container/ContextualBindingBuilder.php | 88 + .../container/EntryNotFoundException.php | 10 + vendor/illuminate/container/LICENSE.md | 21 + .../container/RewindableGenerator.php | 55 + vendor/illuminate/container/Util.php | 65 + vendor/illuminate/container/composer.json | 38 + .../contracts/Auth/Access/Authorizable.php | 15 + .../illuminate/contracts/Auth/Access/Gate.php | 135 + .../contracts/Auth/Authenticatable.php | 50 + .../contracts/Auth/CanResetPassword.php | 20 + vendor/illuminate/contracts/Auth/Factory.php | 21 + vendor/illuminate/contracts/Auth/Guard.php | 51 + .../Auth/Middleware/AuthenticatesRequests.php | 8 + .../contracts/Auth/MustVerifyEmail.php | 31 + .../contracts/Auth/PasswordBroker.php | 54 + .../contracts/Auth/PasswordBrokerFactory.php | 14 + .../contracts/Auth/StatefulGuard.php | 57 + .../contracts/Auth/SupportsBasicAuth.php | 23 + .../contracts/Auth/UserProvider.php | 54 + .../contracts/Broadcasting/Broadcaster.php | 33 + .../contracts/Broadcasting/Factory.php | 14 + .../Broadcasting/HasBroadcastChannel.php | 19 + .../contracts/Broadcasting/ShouldBeUnique.php | 8 + .../Broadcasting/ShouldBroadcast.php | 13 + .../Broadcasting/ShouldBroadcastNow.php | 8 + .../illuminate/contracts/Bus/Dispatcher.php | 60 + .../contracts/Bus/QueueingDispatcher.php | 28 + vendor/illuminate/contracts/Cache/Factory.php | 14 + vendor/illuminate/contracts/Cache/Lock.php | 40 + .../contracts/Cache/LockProvider.php | 24 + .../contracts/Cache/LockTimeoutException.php | 9 + .../illuminate/contracts/Cache/Repository.php | 105 + vendor/illuminate/contracts/Cache/Store.php | 83 + .../contracts/Config/Repository.php | 52 + .../contracts/Console/Application.php | 22 + .../contracts/Console/Isolatable.php | 8 + .../illuminate/contracts/Console/Kernel.php | 58 + .../Console/PromptsForMissingInput.php | 8 + .../Container/BindingResolutionException.php | 10 + .../Container/CircularDependencyException.php | 10 + .../contracts/Container/Container.php | 196 + .../Container/ContextualBindingBuilder.php | 36 + .../illuminate/contracts/Cookie/Factory.php | 45 + .../contracts/Cookie/QueueingFactory.php | 28 + .../contracts/Database/Eloquent/Builder.php | 13 + .../contracts/Database/Eloquent/Castable.php | 14 + .../Database/Eloquent/CastsAttributes.php | 32 + .../Eloquent/CastsInboundAttributes.php | 18 + .../Eloquent/DeviatesCastableAttributes.php | 27 + .../Eloquent/SerializesCastableAttributes.php | 18 + .../Eloquent/SupportsPartialRelations.php | 28 + .../Database/Events/MigrationEvent.php | 8 + .../contracts/Database/ModelIdentifier.php | 66 + .../contracts/Database/Query/Builder.php | 12 + .../Database/Query/ConditionExpression.php | 7 + .../contracts/Database/Query/Expression.php | 15 + .../contracts/Debug/ExceptionHandler.php | 44 + .../contracts/Encryption/DecryptException.php | 9 + .../contracts/Encryption/EncryptException.php | 9 + .../contracts/Encryption/Encrypter.php | 45 + .../contracts/Encryption/StringEncrypter.php | 25 + .../contracts/Events/Dispatcher.php | 74 + .../Events/ShouldDispatchAfterCommit.php | 8 + .../Events/ShouldHandleEventsAfterCommit.php | 8 + .../illuminate/contracts/Filesystem/Cloud.php | 14 + .../contracts/Filesystem/Factory.php | 14 + .../Filesystem/FileNotFoundException.php | 9 + .../contracts/Filesystem/Filesystem.php | 196 + .../Filesystem/LockTimeoutException.php | 9 + .../contracts/Foundation/Application.php | 222 + .../Foundation/CachesConfiguration.php | 25 + .../contracts/Foundation/CachesRoutes.php | 19 + .../Foundation/ExceptionRenderer.php | 14 + .../contracts/Foundation/MaintenanceMode.php | 32 + .../illuminate/contracts/Hashing/Hasher.php | 39 + vendor/illuminate/contracts/Http/Kernel.php | 34 + vendor/illuminate/contracts/LICENSE.md | 21 + .../illuminate/contracts/Mail/Attachable.php | 13 + vendor/illuminate/contracts/Mail/Factory.php | 14 + .../illuminate/contracts/Mail/MailQueue.php | 24 + vendor/illuminate/contracts/Mail/Mailable.php | 68 + vendor/illuminate/contracts/Mail/Mailer.php | 47 + .../contracts/Notifications/Dispatcher.php | 24 + .../contracts/Notifications/Factory.php | 30 + .../contracts/Pagination/CursorPaginator.php | 109 + .../Pagination/LengthAwarePaginator.php | 27 + .../contracts/Pagination/Paginator.php | 109 + vendor/illuminate/contracts/Pipeline/Hub.php | 15 + .../contracts/Pipeline/Pipeline.php | 36 + .../contracts/Process/InvokedProcess.php | 57 + .../contracts/Process/ProcessResult.php | 72 + .../contracts/Queue/ClearableQueue.php | 14 + .../Queue/EntityNotFoundException.php | 20 + .../contracts/Queue/EntityResolver.php | 15 + vendor/illuminate/contracts/Queue/Factory.php | 14 + vendor/illuminate/contracts/Queue/Job.php | 143 + vendor/illuminate/contracts/Queue/Monitor.php | 28 + vendor/illuminate/contracts/Queue/Queue.php | 90 + .../contracts/Queue/QueueableCollection.php | 31 + .../contracts/Queue/QueueableEntity.php | 25 + .../contracts/Queue/ShouldBeEncrypted.php | 8 + .../contracts/Queue/ShouldBeUnique.php | 8 + .../Queue/ShouldBeUniqueUntilProcessing.php | 8 + .../contracts/Queue/ShouldQueue.php | 8 + .../Queue/ShouldQueueAfterCommit.php | 8 + .../illuminate/contracts/Redis/Connection.php | 32 + .../illuminate/contracts/Redis/Connector.php | 24 + vendor/illuminate/contracts/Redis/Factory.php | 14 + .../Redis/LimiterTimeoutException.php | 9 + .../contracts/Routing/BindingRegistrar.php | 22 + .../contracts/Routing/Registrar.php | 95 + .../contracts/Routing/ResponseFactory.php | 142 + .../contracts/Routing/UrlGenerator.php | 100 + .../contracts/Routing/UrlRoutable.php | 36 + .../Middleware/AuthenticatesSessions.php | 8 + .../illuminate/contracts/Session/Session.php | 179 + .../contracts/Support/Arrayable.php | 17 + .../Support/CanBeEscapedWhenCastToString.php | 14 + .../contracts/Support/DeferrableProvider.php | 13 + .../Support/DeferringDisplayableValue.php | 13 + .../illuminate/contracts/Support/Htmlable.php | 13 + .../illuminate/contracts/Support/Jsonable.php | 14 + .../contracts/Support/MessageBag.php | 97 + .../contracts/Support/MessageProvider.php | 13 + .../contracts/Support/Renderable.php | 13 + .../contracts/Support/Responsable.php | 14 + .../contracts/Support/ValidatedData.php | 10 + .../Translation/HasLocalePreference.php | 13 + .../contracts/Translation/Loader.php | 37 + .../contracts/Translation/Translator.php | 39 + .../contracts/Validation/DataAwareRule.php | 14 + .../contracts/Validation/Factory.php | 43 + .../contracts/Validation/ImplicitRule.php | 11 + .../contracts/Validation/InvokableRule.php | 20 + .../illuminate/contracts/Validation/Rule.php | 24 + .../Validation/UncompromisedVerifier.php | 14 + .../Validation/ValidatesWhenResolved.php | 13 + .../contracts/Validation/ValidationRule.php | 17 + .../contracts/Validation/Validator.php | 58 + .../Validation/ValidatorAwareRule.php | 15 + vendor/illuminate/contracts/View/Engine.php | 15 + vendor/illuminate/contracts/View/Factory.php | 72 + vendor/illuminate/contracts/View/View.php | 28 + .../View/ViewCompilationException.php | 9 + vendor/illuminate/contracts/composer.json | 35 + vendor/nette/finder/composer.json | 53 + vendor/nette/finder/license.md | 60 + vendor/nette/finder/readme.md | 159 + vendor/nette/finder/src/Utils/Finder.php | 317 ++ vendor/nette/robot-loader/composer.json | 53 + vendor/nette/robot-loader/license.md | 60 + vendor/nette/robot-loader/ncs.php | 13 + vendor/nette/robot-loader/readme.md | 131 + .../src/RobotLoader/RobotLoader.php | 444 ++ vendor/nette/utils/composer.json | 72 + vendor/nette/utils/license.md | 60 + vendor/nette/utils/readme.md | 54 + vendor/nette/utils/src/HtmlStringable.php | 17 + .../utils/src/Iterators/CachingIterator.php | 133 + vendor/nette/utils/src/Iterators/Mapper.php | 27 + vendor/nette/utils/src/SmartObject.php | 120 + vendor/nette/utils/src/StaticClass.php | 32 + vendor/nette/utils/src/Translator.php | 22 + vendor/nette/utils/src/Utils/ArrayHash.php | 86 + vendor/nette/utils/src/Utils/ArrayList.php | 111 + vendor/nette/utils/src/Utils/Arrays.php | 394 ++ vendor/nette/utils/src/Utils/Callback.php | 151 + vendor/nette/utils/src/Utils/DateTime.php | 105 + vendor/nette/utils/src/Utils/FileSystem.php | 186 + vendor/nette/utils/src/Utils/Floats.php | 83 + vendor/nette/utils/src/Utils/Helpers.php | 78 + vendor/nette/utils/src/Utils/Html.php | 744 +++ vendor/nette/utils/src/Utils/Image.php | 611 +++ vendor/nette/utils/src/Utils/Json.php | 49 + .../nette/utils/src/Utils/ObjectHelpers.php | 175 + vendor/nette/utils/src/Utils/ObjectMixin.php | 32 + vendor/nette/utils/src/Utils/Paginator.php | 191 + vendor/nette/utils/src/Utils/Random.php | 38 + vendor/nette/utils/src/Utils/Reflection.php | 326 ++ vendor/nette/utils/src/Utils/Strings.php | 488 ++ vendor/nette/utils/src/Utils/Type.php | 212 + vendor/nette/utils/src/Utils/Validators.php | 341 ++ vendor/nette/utils/src/Utils/exceptions.php | 40 + vendor/nette/utils/src/compatibility.php | 28 + vendor/nette/utils/src/exceptions.php | 84 + vendor/psr/container/LICENSE | 21 + vendor/psr/container/README.md | 13 + vendor/psr/container/composer.json | 33 + .../src/ContainerExceptionInterface.php | 11 + .../psr/container/src/ContainerInterface.php | 34 + .../src/NotFoundExceptionInterface.php | 10 + vendor/psr/simple-cache/LICENSE.md | 21 + vendor/psr/simple-cache/README.md | 8 + vendor/psr/simple-cache/composer.json | 31 + .../psr/simple-cache/src/CacheException.php | 10 + .../psr/simple-cache/src/CacheInterface.php | 107 + .../src/InvalidArgumentException.php | 13 + vendor/scoper-autoload.php | 101 + vendor/sebastian/diff/ChangeLog.md | 158 + vendor/sebastian/diff/LICENSE | 29 + vendor/sebastian/diff/README.md | 206 + vendor/sebastian/diff/SECURITY.md | 30 + vendor/sebastian/diff/composer.json | 56 + vendor/sebastian/diff/src/Chunk.php | 89 + vendor/sebastian/diff/src/Diff.php | 80 + vendor/sebastian/diff/src/Differ.php | 206 + .../src/Exception/ConfigurationException.php | 24 + .../diff/src/Exception/Exception.php | 17 + .../Exception/InvalidArgumentException.php | 16 + vendor/sebastian/diff/src/Line.php | 52 + .../LongestCommonSubsequenceCalculator.php | 20 + ...ientLongestCommonSubsequenceCalculator.php | 83 + .../src/Output/AbstractChunkOutputBuilder.php | 49 + .../diff/src/Output/DiffOnlyOutputBuilder.php | 68 + .../src/Output/DiffOutputBuilderInterface.php | 21 + .../Output/StrictUnifiedDiffOutputBuilder.php | 252 + .../src/Output/UnifiedDiffOutputBuilder.php | 197 + vendor/sebastian/diff/src/Parser.php | 87 + ...ientLongestCommonSubsequenceCalculator.php | 74 + vendor/symfony/console/Application.php | 1163 +++++ .../symfony/console/Attribute/AsCommand.php | 41 + vendor/symfony/console/CHANGELOG.md | 261 + .../console/CI/GithubActionReporter.php | 79 + vendor/symfony/console/Color.php | 99 + vendor/symfony/console/Command/Command.php | 677 +++ .../console/Command/CompleteCommand.php | 164 + .../console/Command/DumpCompletionCommand.php | 143 + .../symfony/console/Command/HelpCommand.php | 68 + .../symfony/console/Command/LazyCommand.php | 188 + .../symfony/console/Command/ListCommand.php | 60 + .../symfony/console/Command/LockableTrait.php | 62 + .../Command/SignalableCommandInterface.php | 32 + .../console/Command/TraceableCommand.php | 340 ++ .../CommandLoader/CommandLoaderInterface.php | 34 + .../CommandLoader/ContainerCommandLoader.php | 54 + .../CommandLoader/FactoryCommandLoader.php | 49 + .../console/Completion/CompletionInput.php | 228 + .../Completion/CompletionSuggestions.php | 92 + .../Output/BashCompletionOutput.php | 31 + .../Output/CompletionOutputInterface.php | 23 + .../Output/FishCompletionOutput.php | 31 + .../Completion/Output/ZshCompletionOutput.php | 34 + .../symfony/console/Completion/Suggestion.php | 47 + vendor/symfony/console/ConsoleEvents.php | 61 + vendor/symfony/console/Cursor.php | 168 + .../DataCollector/CommandDataCollector.php | 182 + vendor/symfony/console/Debug/CliRequest.php | 70 + .../AddConsoleCommandPass.php | 107 + .../Descriptor/ApplicationDescription.php | 129 + .../symfony/console/Descriptor/Descriptor.php | 78 + .../Descriptor/DescriptorInterface.php | 25 + .../console/Descriptor/JsonDescriptor.php | 112 + .../console/Descriptor/MarkdownDescriptor.php | 128 + .../Descriptor/ReStructuredTextDescriptor.php | 234 + .../console/Descriptor/TextDescriptor.php | 274 + .../console/Descriptor/XmlDescriptor.php | 191 + .../console/Event/ConsoleCommandEvent.php | 50 + .../console/Event/ConsoleErrorEvent.php | 55 + vendor/symfony/console/Event/ConsoleEvent.php | 60 + .../console/Event/ConsoleSignalEvent.php | 60 + .../console/Event/ConsoleTerminateEvent.php | 51 + .../console/EventListener/ErrorListener.php | 82 + .../Exception/CommandNotFoundException.php | 42 + .../console/Exception/ExceptionInterface.php | 20 + .../Exception/InvalidArgumentException.php | 18 + .../Exception/InvalidOptionException.php | 20 + .../console/Exception/LogicException.php | 18 + .../Exception/MissingInputException.php | 20 + .../Exception/NamespaceNotFoundException.php | 20 + .../Exception/RunCommandFailedException.php | 32 + .../console/Exception/RuntimeException.php | 18 + .../console/Formatter/NullOutputFormatter.php | 47 + .../Formatter/NullOutputFormatterStyle.php | 48 + .../console/Formatter/OutputFormatter.php | 241 + .../Formatter/OutputFormatterInterface.php | 50 + .../Formatter/OutputFormatterStyle.php | 113 + .../OutputFormatterStyleInterface.php | 54 + .../Formatter/OutputFormatterStyleStack.php | 94 + .../WrappableOutputFormatterInterface.php | 26 + .../console/Helper/DebugFormatterHelper.php | 89 + .../console/Helper/DescriptorHelper.php | 74 + vendor/symfony/console/Helper/Dumper.php | 73 + .../console/Helper/FormatterHelper.php | 71 + vendor/symfony/console/Helper/Helper.php | 139 + .../console/Helper/HelperInterface.php | 36 + vendor/symfony/console/Helper/HelperSet.php | 68 + .../console/Helper/InputAwareHelper.php | 30 + .../symfony/console/Helper/OutputWrapper.php | 75 + .../symfony/console/Helper/ProcessHelper.php | 116 + vendor/symfony/console/Helper/ProgressBar.php | 597 +++ .../console/Helper/ProgressIndicator.php | 225 + .../symfony/console/Helper/QuestionHelper.php | 508 ++ .../console/Helper/SymfonyQuestionHelper.php | 85 + vendor/symfony/console/Helper/Table.php | 811 +++ vendor/symfony/console/Helper/TableCell.php | 64 + .../symfony/console/Helper/TableCellStyle.php | 59 + vendor/symfony/console/Helper/TableRows.php | 30 + .../symfony/console/Helper/TableSeparator.php | 24 + vendor/symfony/console/Helper/TableStyle.php | 378 ++ vendor/symfony/console/Input/ArgvInput.php | 336 ++ vendor/symfony/console/Input/ArrayInput.php | 181 + vendor/symfony/console/Input/Input.php | 174 + .../symfony/console/Input/InputArgument.php | 155 + .../console/Input/InputAwareInterface.php | 27 + .../symfony/console/Input/InputDefinition.php | 384 ++ .../symfony/console/Input/InputInterface.php | 136 + vendor/symfony/console/Input/InputOption.php | 237 + .../Input/StreamableInputInterface.php | 37 + vendor/symfony/console/Input/StringInput.php | 78 + vendor/symfony/console/LICENSE | 19 + .../symfony/console/Logger/ConsoleLogger.php | 101 + .../console/Messenger/RunCommandContext.php | 39 + .../console/Messenger/RunCommandMessage.php | 48 + .../Messenger/RunCommandMessageHandler.php | 47 + .../symfony/console/Output/AnsiColorMode.php | 76 + .../symfony/console/Output/BufferedOutput.php | 41 + .../symfony/console/Output/ConsoleOutput.php | 146 + .../console/Output/ConsoleOutputInterface.php | 30 + .../console/Output/ConsoleSectionOutput.php | 222 + vendor/symfony/console/Output/NullOutput.php | 95 + vendor/symfony/console/Output/Output.php | 142 + .../console/Output/OutputInterface.php | 98 + .../symfony/console/Output/StreamOutput.php | 105 + .../console/Output/TrimmedBufferOutput.php | 58 + .../console/Question/ChoiceQuestion.php | 163 + .../console/Question/ConfirmationQuestion.php | 53 + vendor/symfony/console/Question/Question.php | 285 + vendor/symfony/console/README.md | 36 + .../console/Resources/bin/hiddeninput.exe | Bin 0 -> 9216 bytes .../symfony/console/Resources/completion.bash | 94 + .../symfony/console/Resources/completion.fish | 29 + .../symfony/console/Resources/completion.zsh | 82 + .../console/SignalRegistry/SignalMap.php | 37 + .../console/SignalRegistry/SignalRegistry.php | 51 + .../console/SingleCommandApplication.php | 71 + vendor/symfony/console/Style/OutputStyle.php | 118 + .../symfony/console/Style/StyleInterface.php | 130 + vendor/symfony/console/Style/SymfonyStyle.php | 470 ++ vendor/symfony/console/Terminal.php | 209 + .../console/Tester/ApplicationTester.php | 79 + .../Tester/CommandCompletionTester.php | 51 + .../symfony/console/Tester/CommandTester.php | 66 + .../Tester/Constraint/CommandIsSuccessful.php | 34 + vendor/symfony/console/Tester/TesterTrait.php | 167 + vendor/symfony/console/composer.json | 62 + .../deprecation-contracts/CHANGELOG.md | 5 + vendor/symfony/deprecation-contracts/LICENSE | 19 + .../symfony/deprecation-contracts/README.md | 26 + .../deprecation-contracts/composer.json | 35 + .../deprecation-contracts/function.php | 27 + vendor/symfony/filesystem/CHANGELOG.md | 82 + .../Exception/ExceptionInterface.php | 20 + .../Exception/FileNotFoundException.php | 32 + .../filesystem/Exception/IOException.php | 35 + .../Exception/IOExceptionInterface.php | 24 + .../Exception/InvalidArgumentException.php | 18 + .../filesystem/Exception/RuntimeException.php | 18 + vendor/symfony/filesystem/Filesystem.php | 670 +++ vendor/symfony/filesystem/LICENSE | 19 + vendor/symfony/filesystem/Path.php | 708 +++ vendor/symfony/filesystem/README.md | 13 + vendor/symfony/filesystem/composer.json | 32 + vendor/symfony/polyfill-ctype/Ctype.php | 205 + vendor/symfony/polyfill-ctype/LICENSE | 19 + vendor/symfony/polyfill-ctype/README.md | 12 + vendor/symfony/polyfill-ctype/bootstrap.php | 82 + vendor/symfony/polyfill-ctype/bootstrap80.php | 112 + vendor/symfony/polyfill-ctype/composer.json | 47 + .../polyfill-intl-grapheme/Grapheme.php | 210 + vendor/symfony/polyfill-intl-grapheme/LICENSE | 19 + .../symfony/polyfill-intl-grapheme/README.md | 31 + .../polyfill-intl-grapheme/bootstrap.php | 82 + .../polyfill-intl-grapheme/bootstrap80.php | 103 + .../polyfill-intl-grapheme/composer.json | 46 + .../symfony/polyfill-intl-normalizer/LICENSE | 19 + .../polyfill-intl-normalizer/Normalizer.php | 258 + .../polyfill-intl-normalizer/README.md | 14 + .../Resources/stubs/Normalizer.php | 20 + .../unidata/canonicalComposition.php | 5 + .../unidata/canonicalDecomposition.php | 5 + .../Resources/unidata/combiningClass.php | 5 + .../unidata/compatibilityDecomposition.php | 5 + .../polyfill-intl-normalizer/bootstrap.php | 28 + .../polyfill-intl-normalizer/bootstrap80.php | 28 + .../polyfill-intl-normalizer/composer.json | 49 + vendor/symfony/polyfill-mbstring/LICENSE | 19 + vendor/symfony/polyfill-mbstring/Mbstring.php | 753 +++ vendor/symfony/polyfill-mbstring/README.md | 13 + .../Resources/unidata/caseFolding.php | 5 + .../Resources/unidata/lowerCase.php | 5 + .../Resources/unidata/titleCaseRegexp.php | 6 + .../Resources/unidata/upperCase.php | 5 + .../symfony/polyfill-mbstring/bootstrap.php | 264 + .../symfony/polyfill-mbstring/bootstrap80.php | 332 ++ .../symfony/polyfill-mbstring/composer.json | 48 + .../service-contracts/Attribute/Required.php | 24 + .../Attribute/SubscribedService.php | 55 + vendor/symfony/service-contracts/CHANGELOG.md | 5 + vendor/symfony/service-contracts/LICENSE | 19 + vendor/symfony/service-contracts/README.md | 9 + .../service-contracts/ResetInterface.php | 32 + .../service-contracts/ServiceLocatorTrait.php | 112 + .../ServiceProviderInterface.php | 41 + .../ServiceSubscriberInterface.php | 60 + .../ServiceSubscriberTrait.php | 67 + .../Test/ServiceLocatorTest.php | 21 + .../Test/ServiceLocatorTestCase.php | 85 + .../symfony/service-contracts/composer.json | 50 + vendor/symfony/string/AbstractString.php | 645 +++ .../symfony/string/AbstractUnicodeString.php | 532 ++ vendor/symfony/string/ByteString.php | 459 ++ vendor/symfony/string/CHANGELOG.md | 40 + vendor/symfony/string/CodePointString.php | 234 + .../string/Exception/ExceptionInterface.php | 15 + .../Exception/InvalidArgumentException.php | 15 + .../string/Exception/RuntimeException.php | 15 + .../string/Inflector/EnglishInflector.php | 404 ++ .../string/Inflector/FrenchInflector.php | 122 + .../string/Inflector/InflectorInterface.php | 31 + vendor/symfony/string/LICENSE | 19 + vendor/symfony/string/LazyString.php | 132 + vendor/symfony/string/README.md | 14 + .../Resources/data/wcswidth_table_wide.php | 11 + .../Resources/data/wcswidth_table_zero.php | 11 + vendor/symfony/string/Resources/functions.php | 34 + .../symfony/string/Slugger/AsciiSlugger.php | 161 + .../string/Slugger/SluggerInterface.php | 25 + vendor/symfony/string/UnicodeString.php | 338 ++ vendor/symfony/string/composer.json | 54 + vendor/symfony/yaml/CHANGELOG.md | 253 + vendor/symfony/yaml/Command/LintCommand.php | 243 + vendor/symfony/yaml/Dumper.php | 140 + vendor/symfony/yaml/Escaper.php | 74 + .../symfony/yaml/Exception/DumpException.php | 20 + .../yaml/Exception/ExceptionInterface.php | 20 + .../symfony/yaml/Exception/ParseException.php | 125 + .../yaml/Exception/RuntimeException.php | 20 + vendor/symfony/yaml/Inline.php | 735 +++ vendor/symfony/yaml/LICENSE | 19 + vendor/symfony/yaml/Parser.php | 1062 ++++ vendor/symfony/yaml/README.md | 13 + vendor/symfony/yaml/Resources/bin/yaml-lint | 35 + vendor/symfony/yaml/Tag/TaggedValue.php | 46 + vendor/symfony/yaml/Unescaper.php | 120 + vendor/symfony/yaml/Yaml.php | 91 + vendor/symfony/yaml/composer.json | 41 + .../rule-doc-generator-contracts/LICENSE | 25 + .../composer.json | 46 + .../Category/CategoryInfererInterface.php | 10 + .../src/Contract/CodeSampleInterface.php | 10 + .../Contract/ConfigurableRuleInterface.php | 8 + .../src/Contract/DocumentedRuleInterface.php | 13 + .../RuleCodeSamplePrinterInterface.php | 14 + .../Exception/PoorDocumentationException.php | 9 + .../Exception/ShouldNotHappenException.php | 9 + .../src/ValueObject/AbstractCodeSample.php | 45 + .../src/ValueObject/CodeSample/CodeSample.php | 12 + .../ComposerJsonAwareCodeSample.php | 23 + .../CodeSample/ConfiguredCodeSample.php | 34 + .../CodeSample/ExtraFileCodeSample.php | 23 + .../src/ValueObject/RuleDefinition.php | 91 + vendor/webmozart/assert/CHANGELOG.md | 207 + vendor/webmozart/assert/LICENSE | 20 + vendor/webmozart/assert/README.md | 287 + vendor/webmozart/assert/composer.json | 43 + vendor/webmozart/assert/src/Assert.php | 1606 ++++++ .../assert/src/InvalidArgumentException.php | 15 + vendor/webmozart/assert/src/Mixin.php | 4630 +++++++++++++++++ 546 files changed, 57173 insertions(+), 1469 deletions(-) delete mode 100644 .editorconfig rename {build/target-repository/.github => .github}/workflows/bare_run.yaml (100%) delete mode 100644 .gitignore delete mode 100755 build/build-scoped.sh delete mode 100644 build/rector-downgrade-php-72.php delete mode 100644 build/target-repository/.github/FUNDING.yml delete mode 100644 build/target-repository/composer.json create mode 100644 composer.lock delete mode 100644 ecs.php delete mode 100644 full-tool-build.sh create mode 100644 php-scoper.phar delete mode 100644 phpstan.neon delete mode 100644 phpunit.xml delete mode 100644 prefix-code.sh delete mode 100644 rector.php delete mode 100644 scoper.php delete mode 100644 tests/AbstractTestCase.php delete mode 100644 tests/DirectoryToMarkdownPrinter/DirectoryToMarkdownPrinterTest.php delete mode 100644 tests/DirectoryToMarkdownPrinter/Expected/php-cs-fixer/phpcsfixer_content.md delete mode 100644 tests/DirectoryToMarkdownPrinter/Expected/phpstan/configurable_phpstan_content.md delete mode 100644 tests/DirectoryToMarkdownPrinter/Expected/phpstan/phpstan_content.md delete mode 100644 tests/DirectoryToMarkdownPrinter/Expected/rector/composer_json_aware_rector_content.md delete mode 100644 tests/DirectoryToMarkdownPrinter/Expected/rector/configurable_rector_content.md delete mode 100644 tests/DirectoryToMarkdownPrinter/Expected/rector/rector_categorized.md delete mode 100644 tests/DirectoryToMarkdownPrinter/Expected/rector/rector_content.md delete mode 100644 tests/DirectoryToMarkdownPrinter/Fixture/PHPCSFixer/Standard/SomeFixer.php delete mode 100644 tests/DirectoryToMarkdownPrinter/Fixture/PHPStan/Configurable/SomePHPStanRule.php delete mode 100644 tests/DirectoryToMarkdownPrinter/Fixture/PHPStan/Standard/SomePHPStanRule.php delete mode 100644 tests/DirectoryToMarkdownPrinter/Fixture/Rector/Configurable/ConfigurableRector.php delete mode 100644 tests/DirectoryToMarkdownPrinter/Fixture/Rector/Configurable/DirectConfiguredStringKeyRector.php delete mode 100644 tests/DirectoryToMarkdownPrinter/Fixture/Rector/Configurable/WithPHPStanTypeObject.php delete mode 100644 tests/DirectoryToMarkdownPrinter/Fixture/Rector/Standard/SomeRector.php delete mode 100644 tests/DirectoryToMarkdownPrinter/Fixture/Rector/Standard/SomeWhiteSpaceCodeSampleRector.php delete mode 100644 tests/DirectoryToMarkdownPrinter/Source/SomeValueObjectWrapper.php delete mode 100644 tests/Fixture/StaticFixtureUpdater.php delete mode 100644 tests/MarkdownDiffer/Fixture/expected_diff.txt delete mode 100644 tests/MarkdownDiffer/MarkdownDifferTest.php delete mode 100644 tests/Text/KeywordHighlighterTest.php create mode 100644 vendor/autoload.php create mode 100755 vendor/bin/yaml-lint create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/InstalledVersions.php create mode 100644 vendor/composer/LICENSE create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_files.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/autoload_static.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/composer/installed.php create mode 100644 vendor/composer/platform_check.php create mode 100644 vendor/illuminate/container/BoundMethod.php create mode 100755 vendor/illuminate/container/Container.php create mode 100644 vendor/illuminate/container/ContextualBindingBuilder.php create mode 100644 vendor/illuminate/container/EntryNotFoundException.php create mode 100644 vendor/illuminate/container/LICENSE.md create mode 100644 vendor/illuminate/container/RewindableGenerator.php create mode 100644 vendor/illuminate/container/Util.php create mode 100755 vendor/illuminate/container/composer.json create mode 100644 vendor/illuminate/contracts/Auth/Access/Authorizable.php create mode 100644 vendor/illuminate/contracts/Auth/Access/Gate.php create mode 100644 vendor/illuminate/contracts/Auth/Authenticatable.php create mode 100644 vendor/illuminate/contracts/Auth/CanResetPassword.php create mode 100644 vendor/illuminate/contracts/Auth/Factory.php create mode 100644 vendor/illuminate/contracts/Auth/Guard.php create mode 100644 vendor/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php create mode 100644 vendor/illuminate/contracts/Auth/MustVerifyEmail.php create mode 100644 vendor/illuminate/contracts/Auth/PasswordBroker.php create mode 100644 vendor/illuminate/contracts/Auth/PasswordBrokerFactory.php create mode 100644 vendor/illuminate/contracts/Auth/StatefulGuard.php create mode 100644 vendor/illuminate/contracts/Auth/SupportsBasicAuth.php create mode 100644 vendor/illuminate/contracts/Auth/UserProvider.php create mode 100644 vendor/illuminate/contracts/Broadcasting/Broadcaster.php create mode 100644 vendor/illuminate/contracts/Broadcasting/Factory.php create mode 100644 vendor/illuminate/contracts/Broadcasting/HasBroadcastChannel.php create mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBeUnique.php create mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBroadcast.php create mode 100644 vendor/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php create mode 100644 vendor/illuminate/contracts/Bus/Dispatcher.php create mode 100644 vendor/illuminate/contracts/Bus/QueueingDispatcher.php create mode 100644 vendor/illuminate/contracts/Cache/Factory.php create mode 100644 vendor/illuminate/contracts/Cache/Lock.php create mode 100644 vendor/illuminate/contracts/Cache/LockProvider.php create mode 100644 vendor/illuminate/contracts/Cache/LockTimeoutException.php create mode 100644 vendor/illuminate/contracts/Cache/Repository.php create mode 100644 vendor/illuminate/contracts/Cache/Store.php create mode 100644 vendor/illuminate/contracts/Config/Repository.php create mode 100644 vendor/illuminate/contracts/Console/Application.php create mode 100644 vendor/illuminate/contracts/Console/Isolatable.php create mode 100644 vendor/illuminate/contracts/Console/Kernel.php create mode 100644 vendor/illuminate/contracts/Console/PromptsForMissingInput.php create mode 100644 vendor/illuminate/contracts/Container/BindingResolutionException.php create mode 100644 vendor/illuminate/contracts/Container/CircularDependencyException.php create mode 100644 vendor/illuminate/contracts/Container/Container.php create mode 100644 vendor/illuminate/contracts/Container/ContextualBindingBuilder.php create mode 100644 vendor/illuminate/contracts/Cookie/Factory.php create mode 100644 vendor/illuminate/contracts/Cookie/QueueingFactory.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/Builder.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/Castable.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php create mode 100644 vendor/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php create mode 100644 vendor/illuminate/contracts/Database/Events/MigrationEvent.php create mode 100644 vendor/illuminate/contracts/Database/ModelIdentifier.php create mode 100644 vendor/illuminate/contracts/Database/Query/Builder.php create mode 100644 vendor/illuminate/contracts/Database/Query/ConditionExpression.php create mode 100644 vendor/illuminate/contracts/Database/Query/Expression.php create mode 100644 vendor/illuminate/contracts/Debug/ExceptionHandler.php create mode 100644 vendor/illuminate/contracts/Encryption/DecryptException.php create mode 100644 vendor/illuminate/contracts/Encryption/EncryptException.php create mode 100644 vendor/illuminate/contracts/Encryption/Encrypter.php create mode 100644 vendor/illuminate/contracts/Encryption/StringEncrypter.php create mode 100644 vendor/illuminate/contracts/Events/Dispatcher.php create mode 100644 vendor/illuminate/contracts/Events/ShouldDispatchAfterCommit.php create mode 100644 vendor/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php create mode 100644 vendor/illuminate/contracts/Filesystem/Cloud.php create mode 100644 vendor/illuminate/contracts/Filesystem/Factory.php create mode 100644 vendor/illuminate/contracts/Filesystem/FileNotFoundException.php create mode 100644 vendor/illuminate/contracts/Filesystem/Filesystem.php create mode 100644 vendor/illuminate/contracts/Filesystem/LockTimeoutException.php create mode 100644 vendor/illuminate/contracts/Foundation/Application.php create mode 100644 vendor/illuminate/contracts/Foundation/CachesConfiguration.php create mode 100644 vendor/illuminate/contracts/Foundation/CachesRoutes.php create mode 100644 vendor/illuminate/contracts/Foundation/ExceptionRenderer.php create mode 100644 vendor/illuminate/contracts/Foundation/MaintenanceMode.php create mode 100644 vendor/illuminate/contracts/Hashing/Hasher.php create mode 100644 vendor/illuminate/contracts/Http/Kernel.php create mode 100644 vendor/illuminate/contracts/LICENSE.md create mode 100644 vendor/illuminate/contracts/Mail/Attachable.php create mode 100644 vendor/illuminate/contracts/Mail/Factory.php create mode 100644 vendor/illuminate/contracts/Mail/MailQueue.php create mode 100644 vendor/illuminate/contracts/Mail/Mailable.php create mode 100644 vendor/illuminate/contracts/Mail/Mailer.php create mode 100644 vendor/illuminate/contracts/Notifications/Dispatcher.php create mode 100644 vendor/illuminate/contracts/Notifications/Factory.php create mode 100644 vendor/illuminate/contracts/Pagination/CursorPaginator.php create mode 100644 vendor/illuminate/contracts/Pagination/LengthAwarePaginator.php create mode 100644 vendor/illuminate/contracts/Pagination/Paginator.php create mode 100644 vendor/illuminate/contracts/Pipeline/Hub.php create mode 100644 vendor/illuminate/contracts/Pipeline/Pipeline.php create mode 100644 vendor/illuminate/contracts/Process/InvokedProcess.php create mode 100644 vendor/illuminate/contracts/Process/ProcessResult.php create mode 100644 vendor/illuminate/contracts/Queue/ClearableQueue.php create mode 100644 vendor/illuminate/contracts/Queue/EntityNotFoundException.php create mode 100644 vendor/illuminate/contracts/Queue/EntityResolver.php create mode 100644 vendor/illuminate/contracts/Queue/Factory.php create mode 100644 vendor/illuminate/contracts/Queue/Job.php create mode 100644 vendor/illuminate/contracts/Queue/Monitor.php create mode 100644 vendor/illuminate/contracts/Queue/Queue.php create mode 100644 vendor/illuminate/contracts/Queue/QueueableCollection.php create mode 100644 vendor/illuminate/contracts/Queue/QueueableEntity.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldBeEncrypted.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldBeUnique.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldQueue.php create mode 100644 vendor/illuminate/contracts/Queue/ShouldQueueAfterCommit.php create mode 100644 vendor/illuminate/contracts/Redis/Connection.php create mode 100644 vendor/illuminate/contracts/Redis/Connector.php create mode 100644 vendor/illuminate/contracts/Redis/Factory.php create mode 100644 vendor/illuminate/contracts/Redis/LimiterTimeoutException.php create mode 100644 vendor/illuminate/contracts/Routing/BindingRegistrar.php create mode 100644 vendor/illuminate/contracts/Routing/Registrar.php create mode 100644 vendor/illuminate/contracts/Routing/ResponseFactory.php create mode 100644 vendor/illuminate/contracts/Routing/UrlGenerator.php create mode 100644 vendor/illuminate/contracts/Routing/UrlRoutable.php create mode 100644 vendor/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php create mode 100644 vendor/illuminate/contracts/Session/Session.php create mode 100755 vendor/illuminate/contracts/Support/Arrayable.php create mode 100644 vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php create mode 100644 vendor/illuminate/contracts/Support/DeferrableProvider.php create mode 100644 vendor/illuminate/contracts/Support/DeferringDisplayableValue.php create mode 100644 vendor/illuminate/contracts/Support/Htmlable.php create mode 100755 vendor/illuminate/contracts/Support/Jsonable.php create mode 100644 vendor/illuminate/contracts/Support/MessageBag.php create mode 100755 vendor/illuminate/contracts/Support/MessageProvider.php create mode 100755 vendor/illuminate/contracts/Support/Renderable.php create mode 100644 vendor/illuminate/contracts/Support/Responsable.php create mode 100644 vendor/illuminate/contracts/Support/ValidatedData.php create mode 100644 vendor/illuminate/contracts/Translation/HasLocalePreference.php create mode 100755 vendor/illuminate/contracts/Translation/Loader.php create mode 100644 vendor/illuminate/contracts/Translation/Translator.php create mode 100644 vendor/illuminate/contracts/Validation/DataAwareRule.php create mode 100644 vendor/illuminate/contracts/Validation/Factory.php create mode 100644 vendor/illuminate/contracts/Validation/ImplicitRule.php create mode 100644 vendor/illuminate/contracts/Validation/InvokableRule.php create mode 100644 vendor/illuminate/contracts/Validation/Rule.php create mode 100644 vendor/illuminate/contracts/Validation/UncompromisedVerifier.php create mode 100644 vendor/illuminate/contracts/Validation/ValidatesWhenResolved.php create mode 100644 vendor/illuminate/contracts/Validation/ValidationRule.php create mode 100644 vendor/illuminate/contracts/Validation/Validator.php create mode 100644 vendor/illuminate/contracts/Validation/ValidatorAwareRule.php create mode 100755 vendor/illuminate/contracts/View/Engine.php create mode 100644 vendor/illuminate/contracts/View/Factory.php create mode 100644 vendor/illuminate/contracts/View/View.php create mode 100644 vendor/illuminate/contracts/View/ViewCompilationException.php create mode 100644 vendor/illuminate/contracts/composer.json create mode 100644 vendor/nette/finder/composer.json create mode 100644 vendor/nette/finder/license.md create mode 100644 vendor/nette/finder/readme.md create mode 100644 vendor/nette/finder/src/Utils/Finder.php create mode 100644 vendor/nette/robot-loader/composer.json create mode 100644 vendor/nette/robot-loader/license.md create mode 100644 vendor/nette/robot-loader/ncs.php create mode 100644 vendor/nette/robot-loader/readme.md create mode 100644 vendor/nette/robot-loader/src/RobotLoader/RobotLoader.php create mode 100644 vendor/nette/utils/composer.json create mode 100644 vendor/nette/utils/license.md create mode 100644 vendor/nette/utils/readme.md create mode 100644 vendor/nette/utils/src/HtmlStringable.php create mode 100644 vendor/nette/utils/src/Iterators/CachingIterator.php create mode 100644 vendor/nette/utils/src/Iterators/Mapper.php create mode 100644 vendor/nette/utils/src/SmartObject.php create mode 100644 vendor/nette/utils/src/StaticClass.php create mode 100644 vendor/nette/utils/src/Translator.php create mode 100644 vendor/nette/utils/src/Utils/ArrayHash.php create mode 100644 vendor/nette/utils/src/Utils/ArrayList.php create mode 100644 vendor/nette/utils/src/Utils/Arrays.php create mode 100644 vendor/nette/utils/src/Utils/Callback.php create mode 100644 vendor/nette/utils/src/Utils/DateTime.php create mode 100644 vendor/nette/utils/src/Utils/FileSystem.php create mode 100644 vendor/nette/utils/src/Utils/Floats.php create mode 100644 vendor/nette/utils/src/Utils/Helpers.php create mode 100644 vendor/nette/utils/src/Utils/Html.php create mode 100644 vendor/nette/utils/src/Utils/Image.php create mode 100644 vendor/nette/utils/src/Utils/Json.php create mode 100644 vendor/nette/utils/src/Utils/ObjectHelpers.php create mode 100644 vendor/nette/utils/src/Utils/ObjectMixin.php create mode 100644 vendor/nette/utils/src/Utils/Paginator.php create mode 100644 vendor/nette/utils/src/Utils/Random.php create mode 100644 vendor/nette/utils/src/Utils/Reflection.php create mode 100644 vendor/nette/utils/src/Utils/Strings.php create mode 100644 vendor/nette/utils/src/Utils/Type.php create mode 100644 vendor/nette/utils/src/Utils/Validators.php create mode 100644 vendor/nette/utils/src/Utils/exceptions.php create mode 100644 vendor/nette/utils/src/compatibility.php create mode 100644 vendor/nette/utils/src/exceptions.php create mode 100644 vendor/psr/container/LICENSE create mode 100644 vendor/psr/container/README.md create mode 100644 vendor/psr/container/composer.json create mode 100644 vendor/psr/container/src/ContainerExceptionInterface.php create mode 100644 vendor/psr/container/src/ContainerInterface.php create mode 100644 vendor/psr/container/src/NotFoundExceptionInterface.php create mode 100644 vendor/psr/simple-cache/LICENSE.md create mode 100644 vendor/psr/simple-cache/README.md create mode 100644 vendor/psr/simple-cache/composer.json create mode 100644 vendor/psr/simple-cache/src/CacheException.php create mode 100644 vendor/psr/simple-cache/src/CacheInterface.php create mode 100644 vendor/psr/simple-cache/src/InvalidArgumentException.php create mode 100644 vendor/scoper-autoload.php create mode 100644 vendor/sebastian/diff/ChangeLog.md create mode 100644 vendor/sebastian/diff/LICENSE create mode 100644 vendor/sebastian/diff/README.md create mode 100644 vendor/sebastian/diff/SECURITY.md create mode 100644 vendor/sebastian/diff/composer.json create mode 100644 vendor/sebastian/diff/src/Chunk.php create mode 100644 vendor/sebastian/diff/src/Diff.php create mode 100644 vendor/sebastian/diff/src/Differ.php create mode 100644 vendor/sebastian/diff/src/Exception/ConfigurationException.php create mode 100644 vendor/sebastian/diff/src/Exception/Exception.php create mode 100644 vendor/sebastian/diff/src/Exception/InvalidArgumentException.php create mode 100644 vendor/sebastian/diff/src/Line.php create mode 100644 vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php create mode 100644 vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php create mode 100644 vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php create mode 100644 vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php create mode 100644 vendor/sebastian/diff/src/Parser.php create mode 100644 vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php create mode 100644 vendor/symfony/console/Application.php create mode 100644 vendor/symfony/console/Attribute/AsCommand.php create mode 100644 vendor/symfony/console/CHANGELOG.md create mode 100644 vendor/symfony/console/CI/GithubActionReporter.php create mode 100644 vendor/symfony/console/Color.php create mode 100644 vendor/symfony/console/Command/Command.php create mode 100644 vendor/symfony/console/Command/CompleteCommand.php create mode 100644 vendor/symfony/console/Command/DumpCompletionCommand.php create mode 100644 vendor/symfony/console/Command/HelpCommand.php create mode 100644 vendor/symfony/console/Command/LazyCommand.php create mode 100644 vendor/symfony/console/Command/ListCommand.php create mode 100644 vendor/symfony/console/Command/LockableTrait.php create mode 100644 vendor/symfony/console/Command/SignalableCommandInterface.php create mode 100644 vendor/symfony/console/Command/TraceableCommand.php create mode 100644 vendor/symfony/console/CommandLoader/CommandLoaderInterface.php create mode 100644 vendor/symfony/console/CommandLoader/ContainerCommandLoader.php create mode 100644 vendor/symfony/console/CommandLoader/FactoryCommandLoader.php create mode 100644 vendor/symfony/console/Completion/CompletionInput.php create mode 100644 vendor/symfony/console/Completion/CompletionSuggestions.php create mode 100644 vendor/symfony/console/Completion/Output/BashCompletionOutput.php create mode 100644 vendor/symfony/console/Completion/Output/CompletionOutputInterface.php create mode 100644 vendor/symfony/console/Completion/Output/FishCompletionOutput.php create mode 100644 vendor/symfony/console/Completion/Output/ZshCompletionOutput.php create mode 100644 vendor/symfony/console/Completion/Suggestion.php create mode 100644 vendor/symfony/console/ConsoleEvents.php create mode 100644 vendor/symfony/console/Cursor.php create mode 100644 vendor/symfony/console/DataCollector/CommandDataCollector.php create mode 100644 vendor/symfony/console/Debug/CliRequest.php create mode 100644 vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php create mode 100644 vendor/symfony/console/Descriptor/ApplicationDescription.php create mode 100644 vendor/symfony/console/Descriptor/Descriptor.php create mode 100644 vendor/symfony/console/Descriptor/DescriptorInterface.php create mode 100644 vendor/symfony/console/Descriptor/JsonDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/MarkdownDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/TextDescriptor.php create mode 100644 vendor/symfony/console/Descriptor/XmlDescriptor.php create mode 100644 vendor/symfony/console/Event/ConsoleCommandEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleErrorEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleSignalEvent.php create mode 100644 vendor/symfony/console/Event/ConsoleTerminateEvent.php create mode 100644 vendor/symfony/console/EventListener/ErrorListener.php create mode 100644 vendor/symfony/console/Exception/CommandNotFoundException.php create mode 100644 vendor/symfony/console/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/console/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/console/Exception/InvalidOptionException.php create mode 100644 vendor/symfony/console/Exception/LogicException.php create mode 100644 vendor/symfony/console/Exception/MissingInputException.php create mode 100644 vendor/symfony/console/Exception/NamespaceNotFoundException.php create mode 100644 vendor/symfony/console/Exception/RunCommandFailedException.php create mode 100644 vendor/symfony/console/Exception/RuntimeException.php create mode 100644 vendor/symfony/console/Formatter/NullOutputFormatter.php create mode 100644 vendor/symfony/console/Formatter/NullOutputFormatterStyle.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatter.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterInterface.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyle.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php create mode 100644 vendor/symfony/console/Formatter/OutputFormatterStyleStack.php create mode 100644 vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php create mode 100644 vendor/symfony/console/Helper/DebugFormatterHelper.php create mode 100644 vendor/symfony/console/Helper/DescriptorHelper.php create mode 100644 vendor/symfony/console/Helper/Dumper.php create mode 100644 vendor/symfony/console/Helper/FormatterHelper.php create mode 100644 vendor/symfony/console/Helper/Helper.php create mode 100644 vendor/symfony/console/Helper/HelperInterface.php create mode 100644 vendor/symfony/console/Helper/HelperSet.php create mode 100644 vendor/symfony/console/Helper/InputAwareHelper.php create mode 100644 vendor/symfony/console/Helper/OutputWrapper.php create mode 100644 vendor/symfony/console/Helper/ProcessHelper.php create mode 100644 vendor/symfony/console/Helper/ProgressBar.php create mode 100644 vendor/symfony/console/Helper/ProgressIndicator.php create mode 100644 vendor/symfony/console/Helper/QuestionHelper.php create mode 100644 vendor/symfony/console/Helper/SymfonyQuestionHelper.php create mode 100644 vendor/symfony/console/Helper/Table.php create mode 100644 vendor/symfony/console/Helper/TableCell.php create mode 100644 vendor/symfony/console/Helper/TableCellStyle.php create mode 100644 vendor/symfony/console/Helper/TableRows.php create mode 100644 vendor/symfony/console/Helper/TableSeparator.php create mode 100644 vendor/symfony/console/Helper/TableStyle.php create mode 100644 vendor/symfony/console/Input/ArgvInput.php create mode 100644 vendor/symfony/console/Input/ArrayInput.php create mode 100644 vendor/symfony/console/Input/Input.php create mode 100644 vendor/symfony/console/Input/InputArgument.php create mode 100644 vendor/symfony/console/Input/InputAwareInterface.php create mode 100644 vendor/symfony/console/Input/InputDefinition.php create mode 100644 vendor/symfony/console/Input/InputInterface.php create mode 100644 vendor/symfony/console/Input/InputOption.php create mode 100644 vendor/symfony/console/Input/StreamableInputInterface.php create mode 100644 vendor/symfony/console/Input/StringInput.php create mode 100644 vendor/symfony/console/LICENSE create mode 100644 vendor/symfony/console/Logger/ConsoleLogger.php create mode 100644 vendor/symfony/console/Messenger/RunCommandContext.php create mode 100644 vendor/symfony/console/Messenger/RunCommandMessage.php create mode 100644 vendor/symfony/console/Messenger/RunCommandMessageHandler.php create mode 100644 vendor/symfony/console/Output/AnsiColorMode.php create mode 100644 vendor/symfony/console/Output/BufferedOutput.php create mode 100644 vendor/symfony/console/Output/ConsoleOutput.php create mode 100644 vendor/symfony/console/Output/ConsoleOutputInterface.php create mode 100644 vendor/symfony/console/Output/ConsoleSectionOutput.php create mode 100644 vendor/symfony/console/Output/NullOutput.php create mode 100644 vendor/symfony/console/Output/Output.php create mode 100644 vendor/symfony/console/Output/OutputInterface.php create mode 100644 vendor/symfony/console/Output/StreamOutput.php create mode 100644 vendor/symfony/console/Output/TrimmedBufferOutput.php create mode 100644 vendor/symfony/console/Question/ChoiceQuestion.php create mode 100644 vendor/symfony/console/Question/ConfirmationQuestion.php create mode 100644 vendor/symfony/console/Question/Question.php create mode 100644 vendor/symfony/console/README.md create mode 100644 vendor/symfony/console/Resources/bin/hiddeninput.exe create mode 100644 vendor/symfony/console/Resources/completion.bash create mode 100644 vendor/symfony/console/Resources/completion.fish create mode 100644 vendor/symfony/console/Resources/completion.zsh create mode 100644 vendor/symfony/console/SignalRegistry/SignalMap.php create mode 100644 vendor/symfony/console/SignalRegistry/SignalRegistry.php create mode 100644 vendor/symfony/console/SingleCommandApplication.php create mode 100644 vendor/symfony/console/Style/OutputStyle.php create mode 100644 vendor/symfony/console/Style/StyleInterface.php create mode 100644 vendor/symfony/console/Style/SymfonyStyle.php create mode 100644 vendor/symfony/console/Terminal.php create mode 100644 vendor/symfony/console/Tester/ApplicationTester.php create mode 100644 vendor/symfony/console/Tester/CommandCompletionTester.php create mode 100644 vendor/symfony/console/Tester/CommandTester.php create mode 100644 vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.php create mode 100644 vendor/symfony/console/Tester/TesterTrait.php create mode 100644 vendor/symfony/console/composer.json create mode 100644 vendor/symfony/deprecation-contracts/CHANGELOG.md create mode 100644 vendor/symfony/deprecation-contracts/LICENSE create mode 100644 vendor/symfony/deprecation-contracts/README.md create mode 100644 vendor/symfony/deprecation-contracts/composer.json create mode 100644 vendor/symfony/deprecation-contracts/function.php create mode 100644 vendor/symfony/filesystem/CHANGELOG.md create mode 100644 vendor/symfony/filesystem/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/filesystem/Exception/FileNotFoundException.php create mode 100644 vendor/symfony/filesystem/Exception/IOException.php create mode 100644 vendor/symfony/filesystem/Exception/IOExceptionInterface.php create mode 100644 vendor/symfony/filesystem/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/filesystem/Exception/RuntimeException.php create mode 100644 vendor/symfony/filesystem/Filesystem.php create mode 100644 vendor/symfony/filesystem/LICENSE create mode 100644 vendor/symfony/filesystem/Path.php create mode 100644 vendor/symfony/filesystem/README.md create mode 100644 vendor/symfony/filesystem/composer.json create mode 100644 vendor/symfony/polyfill-ctype/Ctype.php create mode 100644 vendor/symfony/polyfill-ctype/LICENSE create mode 100644 vendor/symfony/polyfill-ctype/README.md create mode 100644 vendor/symfony/polyfill-ctype/bootstrap.php create mode 100644 vendor/symfony/polyfill-ctype/bootstrap80.php create mode 100644 vendor/symfony/polyfill-ctype/composer.json create mode 100644 vendor/symfony/polyfill-intl-grapheme/Grapheme.php create mode 100644 vendor/symfony/polyfill-intl-grapheme/LICENSE create mode 100644 vendor/symfony/polyfill-intl-grapheme/README.md create mode 100644 vendor/symfony/polyfill-intl-grapheme/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-grapheme/bootstrap80.php create mode 100644 vendor/symfony/polyfill-intl-grapheme/composer.json create mode 100644 vendor/symfony/polyfill-intl-normalizer/LICENSE create mode 100644 vendor/symfony/polyfill-intl-normalizer/Normalizer.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/README.md create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/bootstrap80.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/composer.json create mode 100644 vendor/symfony/polyfill-mbstring/LICENSE create mode 100644 vendor/symfony/polyfill-mbstring/Mbstring.php create mode 100644 vendor/symfony/polyfill-mbstring/README.md create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php create mode 100644 vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php create mode 100644 vendor/symfony/polyfill-mbstring/bootstrap.php create mode 100644 vendor/symfony/polyfill-mbstring/bootstrap80.php create mode 100644 vendor/symfony/polyfill-mbstring/composer.json create mode 100644 vendor/symfony/service-contracts/Attribute/Required.php create mode 100644 vendor/symfony/service-contracts/Attribute/SubscribedService.php create mode 100644 vendor/symfony/service-contracts/CHANGELOG.md create mode 100644 vendor/symfony/service-contracts/LICENSE create mode 100644 vendor/symfony/service-contracts/README.md create mode 100644 vendor/symfony/service-contracts/ResetInterface.php create mode 100644 vendor/symfony/service-contracts/ServiceLocatorTrait.php create mode 100644 vendor/symfony/service-contracts/ServiceProviderInterface.php create mode 100644 vendor/symfony/service-contracts/ServiceSubscriberInterface.php create mode 100644 vendor/symfony/service-contracts/ServiceSubscriberTrait.php create mode 100644 vendor/symfony/service-contracts/Test/ServiceLocatorTest.php create mode 100644 vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php create mode 100644 vendor/symfony/service-contracts/composer.json create mode 100644 vendor/symfony/string/AbstractString.php create mode 100644 vendor/symfony/string/AbstractUnicodeString.php create mode 100644 vendor/symfony/string/ByteString.php create mode 100644 vendor/symfony/string/CHANGELOG.md create mode 100644 vendor/symfony/string/CodePointString.php create mode 100644 vendor/symfony/string/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/string/Exception/InvalidArgumentException.php create mode 100644 vendor/symfony/string/Exception/RuntimeException.php create mode 100644 vendor/symfony/string/Inflector/EnglishInflector.php create mode 100644 vendor/symfony/string/Inflector/FrenchInflector.php create mode 100644 vendor/symfony/string/Inflector/InflectorInterface.php create mode 100644 vendor/symfony/string/LICENSE create mode 100644 vendor/symfony/string/LazyString.php create mode 100644 vendor/symfony/string/README.md create mode 100644 vendor/symfony/string/Resources/data/wcswidth_table_wide.php create mode 100644 vendor/symfony/string/Resources/data/wcswidth_table_zero.php create mode 100644 vendor/symfony/string/Resources/functions.php create mode 100644 vendor/symfony/string/Slugger/AsciiSlugger.php create mode 100644 vendor/symfony/string/Slugger/SluggerInterface.php create mode 100644 vendor/symfony/string/UnicodeString.php create mode 100644 vendor/symfony/string/composer.json create mode 100644 vendor/symfony/yaml/CHANGELOG.md create mode 100644 vendor/symfony/yaml/Command/LintCommand.php create mode 100644 vendor/symfony/yaml/Dumper.php create mode 100644 vendor/symfony/yaml/Escaper.php create mode 100644 vendor/symfony/yaml/Exception/DumpException.php create mode 100644 vendor/symfony/yaml/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/yaml/Exception/ParseException.php create mode 100644 vendor/symfony/yaml/Exception/RuntimeException.php create mode 100644 vendor/symfony/yaml/Inline.php create mode 100644 vendor/symfony/yaml/LICENSE create mode 100644 vendor/symfony/yaml/Parser.php create mode 100644 vendor/symfony/yaml/README.md create mode 100755 vendor/symfony/yaml/Resources/bin/yaml-lint create mode 100644 vendor/symfony/yaml/Tag/TaggedValue.php create mode 100644 vendor/symfony/yaml/Unescaper.php create mode 100644 vendor/symfony/yaml/Yaml.php create mode 100644 vendor/symfony/yaml/composer.json create mode 100644 vendor/symplify/rule-doc-generator-contracts/LICENSE create mode 100644 vendor/symplify/rule-doc-generator-contracts/composer.json create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/Contract/Category/CategoryInfererInterface.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/Contract/CodeSampleInterface.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/Contract/ConfigurableRuleInterface.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/Contract/DocumentedRuleInterface.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/Contract/RuleCodeSamplePrinterInterface.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/Exception/PoorDocumentationException.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/Exception/ShouldNotHappenException.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/ValueObject/AbstractCodeSample.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/CodeSample.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ComposerJsonAwareCodeSample.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ConfiguredCodeSample.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ExtraFileCodeSample.php create mode 100644 vendor/symplify/rule-doc-generator-contracts/src/ValueObject/RuleDefinition.php create mode 100644 vendor/webmozart/assert/CHANGELOG.md create mode 100644 vendor/webmozart/assert/LICENSE create mode 100644 vendor/webmozart/assert/README.md create mode 100644 vendor/webmozart/assert/composer.json create mode 100644 vendor/webmozart/assert/src/Assert.php create mode 100644 vendor/webmozart/assert/src/InvalidArgumentException.php create mode 100644 vendor/webmozart/assert/src/Mixin.php diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 95ccdcd8..00000000 --- a/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -indent_style = space -indent_size = 4 \ No newline at end of file diff --git a/build/target-repository/.github/workflows/bare_run.yaml b/.github/workflows/bare_run.yaml similarity index 100% rename from build/target-repository/.github/workflows/bare_run.yaml rename to .github/workflows/bare_run.yaml diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 382f83c8..00000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/vendor -composer.lock - -.phpunit.cache diff --git a/bin/rule-doc-generator b/bin/rule-doc-generator index 94553f6e..86a35ea2 100755 --- a/bin/rule-doc-generator +++ b/bin/rule-doc-generator @@ -1,4 +1,5 @@ #!/usr/bin/env php -create(); - - -$application = $container->make(\Symfony\Component\Console\Application::class); +$application = $container->make(\RuleDocGenerator202403\Symfony\Component\Console\Application::class); $exitCode = $application->run(); exit($exitCode); diff --git a/build/build-scoped.sh b/build/build-scoped.sh deleted file mode 100755 index 2a143f85..00000000 --- a/build/build-scoped.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env bash - -# inspired from https://github.com/rectorphp/rector/blob/main/build/build-rector-scoped.sh - -# see https://stackoverflow.com/questions/66644233/how-to-propagate-colors-from-bash-script-to-github-action?noredirect=1#comment117811853_66644233 -export TERM=xterm-color - -# show errors -set -e - -# script fails if trying to access to an undefined variable -set -u - - -# functions -note() -{ - MESSAGE=$1; - printf "\n"; - echo "\033[0;33m[NOTE] $MESSAGE\033[0m"; -} - - -# configure here -BUILD_DIRECTORY=$1 -RESULT_DIRECTORY=$2 - -# --------------------------- - -note "Starts" - -# 2. scope it -note "Running scoper with '$RESULT_DIRECTORY' output directory" -wget https://github.com/humbug/php-scoper/releases/download/0.17.5/php-scoper.phar -N --no-verbose - -# create directory -mkdir "$RESULT_DIRECTORY" -p - -# Work around possible PHP memory limits -php -d memory_limit=-1 php-scoper.phar add-prefix bin src stubs vendor composer.json --output-dir "../$RESULT_DIRECTORY" --config scoper.php --force --ansi --working-dir "$BUILD_DIRECTORY" - -note "Show prefixed files in '$RESULT_DIRECTORY'" -ls -l $RESULT_DIRECTORY - -note "Dumping Composer Autoload" -composer dump-autoload --working-dir "$RESULT_DIRECTORY" --ansi --classmap-authoritative --no-dev - -# make bin/rule-doc-generator runnable without "php" -chmod 777 "$RESULT_DIRECTORY/bin/rule-doc-generator" -chmod 777 "$RESULT_DIRECTORY/bin/rule-doc-generator.php" - -note "Finished" diff --git a/build/rector-downgrade-php-72.php b/build/rector-downgrade-php-72.php deleted file mode 100644 index 68641a45..00000000 --- a/build/rector-downgrade-php-72.php +++ /dev/null @@ -1,15 +0,0 @@ -sets([DowngradeLevelSetList::DOWN_TO_PHP_72]); - - $rectorConfig->skip([ - '*/Tests/*', - '*/tests/*', - ]); -}; diff --git a/build/target-repository/.github/FUNDING.yml b/build/target-repository/.github/FUNDING.yml deleted file mode 100644 index f797866a..00000000 --- a/build/target-repository/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -# These are supported funding model platforms -github: tomasvotruba -custom: https://www.paypal.me/rectorphp diff --git a/build/target-repository/composer.json b/build/target-repository/composer.json deleted file mode 100644 index ee615ac1..00000000 --- a/build/target-repository/composer.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "symplify/rule-doc-generator", - "description": "Documentation generator for coding standard or static analysis rules", - "license": "MIT", - "require": { - "php": ">=7.2" - }, - "bin": [ - "bin/rule-doc-generator" - ] -} diff --git a/composer.json b/composer.json index 6dba39c9..ee615ac1 100644 --- a/composer.json +++ b/composer.json @@ -2,46 +2,10 @@ "name": "symplify/rule-doc-generator", "description": "Documentation generator for coding standard or static analysis rules", "license": "MIT", - "bin": [ - "bin/rule-doc-generator" - ], "require": { - "php": ">=8.2", - "symfony/console": "^6.4", - "nette/robot-loader": "^3.4|^4.0", - "symplify/rule-doc-generator-contracts": "^11.1", - "nette/utils": "^3.2|^4.0", - "sebastian/diff": "^5.1|^6.0", - "illuminate/container": "^10.39|^11.0", - "webmozart/assert": "^1.11", - "symfony/yaml": "^6.4", - "symfony/filesystem": "^6.4" - }, - "require-dev": { - "phpunit/phpunit": "^11.0", - "phpstan/phpstan": "^1.10.56", - "symplify/easy-coding-standard": "^12.0", - "rector/rector": "dev-main", - "tracy/tracy": "^2.10", - "tomasvotruba/class-leak": "^0.2" - }, - "autoload": { - "psr-4": { - "Symplify\\RuleDocGenerator\\": "src" - } + "php": ">=7.2" }, - "autoload-dev": { - "psr-4": { - "Symplify\\RuleDocGenerator\\Tests\\": "tests" - }, - "classmap": [ - "stubs" - ] - }, - "scripts": { - "phpstan": "vendor/bin/phpstan analyse --ansi", - "check-cs": "vendor/bin/ecs check --ansi", - "fix-cs": "vendor/bin/ecs check --fix --ansi", - "rector": "vendor/bin/rector process --dry-run --ansi" - } + "bin": [ + "bin/rule-doc-generator" + ] } diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000..eb5793cd --- /dev/null +++ b/composer.lock @@ -0,0 +1,3278 @@ +{ + "_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": "af28f2cd2f6819a2088b0cda3edab33b", + "packages": [ + { + "name": "illuminate/container", + "version": "v11.0.7", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "78cbe88cdc7300efd4cf90244abec2e3c42219bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/78cbe88cdc7300efd4cf90244abec2e3c42219bb", + "reference": "78cbe88cdc7300efd4cf90244abec2e3c42219bb", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^11.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1" + }, + "provide": { + "psr/container-implementation": "1.1|2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2023-09-15T13:17:41+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v11.0.7", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "fae548ad43f569fc506f40385b2e0dcf1f4eb2c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/fae548ad43f569fc506f40385b2e0dcf1f4eb2c9", + "reference": "fae548ad43f569fc506f40385b2e0dcf1f4eb2c9", + "shasum": "" + }, + "require": { + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/simple-cache": "^1.0|^2.0|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2024-02-23T15:52:10+00:00" + }, + { + "name": "nette/finder", + "version": "v2.6.0", + "source": { + "type": "git", + "url": "https://github.com/nette/finder.git", + "reference": "991aefb42860abeab8e003970c3809a9d83cb932" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/finder/zipball/991aefb42860abeab8e003970c3809a9d83cb932", + "reference": "991aefb42860abeab8e003970c3809a9d83cb932", + "shasum": "" + }, + "require": { + "nette/utils": "^2.4 || ^3.0", + "php": ">=7.1" + }, + "conflict": { + "nette/nette": "<2.2" + }, + "require-dev": { + "nette/tester": "^2.0", + "phpstan/phpstan": "^0.12", + "tracy/tracy": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "autoload": { + "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 Finder: find files and directories with an intuitive API.", + "homepage": "https://nette.org", + "keywords": [ + "filesystem", + "glob", + "iterator", + "nette" + ], + "support": { + "issues": "https://github.com/nette/finder/issues", + "source": "https://github.com/nette/finder/tree/v2.6.0" + }, + "time": "2022-10-13T01:31:15+00:00" + }, + { + "name": "nette/robot-loader", + "version": "v3.4.2", + "source": { + "type": "git", + "url": "https://github.com/nette/robot-loader.git", + "reference": "970c8f82be98ec54180c88a468cd2b057855d993" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/robot-loader/zipball/970c8f82be98ec54180c88a468cd2b057855d993", + "reference": "970c8f82be98ec54180c88a468cd2b057855d993", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "nette/finder": "^2.5 || ^3.0", + "nette/utils": "^3.0", + "php": ">=7.1" + }, + "require-dev": { + "nette/tester": "^2.0", + "phpstan/phpstan": "^0.12", + "tracy/tracy": "^2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "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 RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.", + "homepage": "https://nette.org", + "keywords": [ + "autoload", + "class", + "interface", + "nette", + "trait" + ], + "support": { + "issues": "https://github.com/nette/robot-loader/issues", + "source": "https://github.com/nette/robot-loader/tree/v3.4.2" + }, + "time": "2022-12-14T15:41:06+00:00" + }, + { + "name": "nette/utils", + "version": "v3.2.10", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2", + "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.4" + }, + "conflict": { + "nette/di": "<3.0.6" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "~2.0", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.3" + }, + "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()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "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/v3.2.10" + }, + "time": "2023-07-30T15:38:18+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ab83243ecc233de5655b76f577711de9f842e712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ab83243ecc233de5655b76f577711de9f842e712", + "reference": "ab83243ecc233de5655b76f577711de9f842e712", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "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" + }, + { + "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/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:30:33+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/0d9e4eb5ad413075624378f474c4167ea202de78", + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.4" + }, + "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-02-22T20:27:10+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "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.4.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": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.4.3" + }, + "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-01-23T14:51:35+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "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": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "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": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.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-01-29T20:11:03+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "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": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + }, + "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": "2023-12-26T14:02:43+00:00" + }, + { + "name": "symfony/string", + "version": "v7.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b", + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.0.4" + }, + "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-02-01T13:17:36+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v6.4.3" + }, + "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-01-23T14:51:35+00:00" + }, + { + "name": "symplify/rule-doc-generator-contracts", + "version": "11.1.26", + "source": { + "type": "git", + "url": "https://github.com/symplify/rule-doc-generator-contracts.git", + "reference": "3e66b3fec678b74a076395ec629d535fb95293b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symplify/rule-doc-generator-contracts/zipball/3e66b3fec678b74a076395ec629d535fb95293b5", + "reference": "3e66b3fec678b74a076395ec629d535fb95293b5", + "shasum": "" + }, + "require": { + "nette/utils": "^3.2", + "php": ">=8.1" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.2", + "rector/rector": "^0.15.10", + "symplify/easy-ci": "^11.1", + "symplify/easy-coding-standard": "^11.1", + "symplify/easy-testing": "^11.1", + "symplify/phpstan-extensions": "^11.1", + "symplify/phpstan-rules": "11.2.3.72", + "tomasvotruba/unused-public": "^0.0.34" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symplify\\RuleDocGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Contracts for production code of RuleDocGenerator", + "support": { + "source": "https://github.com/symplify/rule-doc-generator-contracts/tree/11.1.26" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2023-02-07T07:16:13+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "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", + "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.11.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.0.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", + "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "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": "5.0-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.0.2" + }, + "time": "2024-03-05T20:51:40+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": "phpstan/phpstan", + "version": "1.10.63", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "ad12836d9ca227301f5fb9960979574ed8628339" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ad12836d9ca227301f5fb9960979574ed8628339", + "reference": "ad12836d9ca227301f5fb9960979574ed8628339", + "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" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2024-03-18T16:53:53+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "7e35a2cbcabac0e6865fd373742ea432a3c34f92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e35a2cbcabac0e6865fd373742ea432a3c34f92", + "reference": "7e35a2cbcabac0e6865fd373742ea432a3c34f92", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.0", + "phpunit/php-text-template": "^4.0", + "sebastian/code-unit-reverse-lookup": "^4.0", + "sebastian/complexity": "^4.0", + "sebastian/environment": "^7.0", + "sebastian/lines-of-code": "^3.0", + "sebastian/version": "^5.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "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": "11.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 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/11.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-12T15:35:40+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "99e95c94ad9500daca992354fa09d7b99abe2210" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/99e95c94ad9500daca992354fa09d7b99abe2210", + "reference": "99e95c94ad9500daca992354fa09d7b99abe2210", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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", + "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:05:04+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5d8d9355a16d8cc5a1305b0a85342cfa420612be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5d8d9355a16d8cc5a1305b0a85342cfa420612be", + "reference": "5d8d9355a16d8cc5a1305b0a85342cfa420612be", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "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", + "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", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:05:50+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "d38f6cbff1cdb6f40b03c9811421561668cc133e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/d38f6cbff1cdb6f40b03c9811421561668cc133e", + "reference": "d38f6cbff1cdb6f40b03c9811421561668cc133e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:06:56+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "8a59d9e25720482ee7fcdf296595e08795b84dc5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8a59d9e25720482ee7fcdf296595e08795b84dc5", + "reference": "8a59d9e25720482ee7fcdf296595e08795b84dc5", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.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", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:08:01+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "6af32d7938fc366f86e49a5f5ebb314018d1b1fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6af32d7938fc366f86e49a5f5ebb314018d1b1fb", + "reference": "6af32d7938fc366f86e49a5f5ebb314018d1b1fb", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0", + "phpunit/php-file-iterator": "^5.0", + "phpunit/php-invoker": "^5.0", + "phpunit/php-text-template": "^4.0", + "phpunit/php-timer": "^7.0", + "sebastian/cli-parser": "^3.0", + "sebastian/code-unit": "^3.0", + "sebastian/comparator": "^6.0", + "sebastian/diff": "^6.0", + "sebastian/environment": "^7.0", + "sebastian/exporter": "^6.0", + "sebastian/global-state": "^7.0", + "sebastian/object-enumerator": "^6.0", + "sebastian/type": "^5.0", + "sebastian/version": "^5.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0-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/11.0.6" + }, + "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": "2024-03-12T15:40:01+00:00" + }, + { + "name": "rector/rector", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "0268ca2b1cd836422923918f31ab924aa73971b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/0268ca2b1cd836422923918f31ab924aa73971b8", + "reference": "0268ca2b1cd836422923918f31ab924aa73971b8", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.10.57" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "default-branch": true, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/main" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-03-17T08:46:45+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "00a74d5568694711f0222e54fb281e1d15fdf04a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/00a74d5568694711f0222e54fb281e1d15fdf04a", + "reference": "00a74d5568694711f0222e54fb281e1d15fdf04a", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:26:58+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "6634549cb8d702282a04a774e36a7477d2bd9015" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/6634549cb8d702282a04a774e36a7477d2bd9015", + "reference": "6634549cb8d702282a04a774e36a7477d2bd9015", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:50:41+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "df80c875d3e459b45c6039e4d9b71d4fbccae25d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/df80c875d3e459b45c6039e4d9b71d4fbccae25d", + "reference": "df80c875d3e459b45c6039e4d9b71d4fbccae25d", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + } + ], + "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", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:52:17+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "bd0f2fa5b9257c69903537b266ccb80fcf940db8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/bd0f2fa5b9257c69903537b266ccb80fcf940db8", + "reference": "bd0f2fa5b9257c69903537b266ccb80fcf940db8", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + }, + { + "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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:53:45+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "88a434ad86150e11a606ac4866b09130712671f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/88a434ad86150e11a606ac4866b09130712671f0", + "reference": "88a434ad86150e11a606ac4866b09130712671f0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:55:19+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "100d8b855d7180f79f9a9a5c483f2d960581c3ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/100d8b855d7180f79f9a9a5c483f2d960581c3ea", + "reference": "100d8b855d7180f79f9a9a5c483f2d960581c3ea", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-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/7.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T05:57:54+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "f291e5a317c321c0381fa9ecc796fa2d21b186da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f291e5a317c321c0381fa9ecc796fa2d21b186da", + "reference": "f291e5a317c321c0381fa9ecc796fa2d21b186da", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + }, + { + "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/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:28:20+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "c3a307e832f2e69c7ef869e31fc644fde0e7cb3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c3a307e832f2e69c7ef869e31fc644fde0e7cb3e", + "reference": "c3a307e832f2e69c7ef869e31fc644fde0e7cb3e", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.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/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T07:32:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "376c5b3f6b43c78fdc049740bca76a7c846706c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/376c5b3f6b43c78fdc049740bca76a7c846706c0", + "reference": "376c5b3f6b43c78fdc049740bca76a7c846706c0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:00:36+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f75f6c460da0bbd9668f43a3dde0ec0ba7faa678" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f75f6c460da0bbd9668f43a3dde0ec0ba7faa678", + "reference": "f75f6c460da0bbd9668f43a3dde0ec0ba7faa678", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.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": "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", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:01:29+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "bb2a6255d30853425fd38f032eb64ced9f7f132d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/bb2a6255d30853425fd38f032eb64ced9f7f132d", + "reference": "bb2a6255d30853425fd38f032eb64ced9f7f132d", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + } + ], + "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", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:02:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "b75224967b5a466925c6d54e68edd0edf8dd4ed4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b75224967b5a466925c6d54e68edd0edf8dd4ed4", + "reference": "b75224967b5a466925c6d54e68edd0edf8dd4ed4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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" + }, + { + "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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:08:48+00:00" + }, + { + "name": "sebastian/type", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "b8502785eb3523ca0dd4afe9ca62235590020f3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8502785eb3523ca0dd4afe9ca62235590020f3f", + "reference": "b8502785eb3523ca0dd4afe9ca62235590020f3f", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.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", + "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", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:09:34+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "13999475d2cb1ab33cb73403ba356a814fdbb001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/13999475d2cb1ab33cb73403ba356a814fdbb001", + "reference": "13999475d2cb1ab33cb73403ba356a814fdbb001", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "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", + "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", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-02-02T06:10:47+00:00" + }, + { + "name": "symplify/easy-coding-standard", + "version": "12.1.14", + "source": { + "type": "git", + "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", + "reference": "e3c4a241ee36704f7cf920d5931f39693e64afd5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/e3c4a241ee36704f7cf920d5931f39693e64afd5", + "reference": "e3c4a241ee36704f7cf920d5931f39693e64afd5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "conflict": { + "friendsofphp/php-cs-fixer": "<3.46", + "phpcsstandards/php_codesniffer": "<3.8", + "symplify/coding-standard": "<12.1" + }, + "bin": [ + "bin/ecs" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer", + "keywords": [ + "Code style", + "automation", + "fixer", + "static analysis" + ], + "support": { + "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.1.14" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-02-23T13:10:40+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" + }, + { + "name": "tomasvotruba/class-leak", + "version": "0.2.11", + "source": { + "type": "git", + "url": "https://github.com/TomasVotruba/class-leak.git", + "reference": "c8a49e7c3c55dc01006397d4adfef40606510e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TomasVotruba/class-leak/zipball/c8a49e7c3c55dc01006397d4adfef40606510e5b", + "reference": "c8a49e7c3c55dc01006397d4adfef40606510e5b", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "bin": [ + "bin/class-leak", + "bin/class-leak.php" + ], + "type": "library", + "autoload": { + "psr-4": { + "TomasVotruba\\ClassLeak\\": "app" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Detect leaking classes", + "support": { + "issues": "https://github.com/TomasVotruba/class-leak/issues", + "source": "https://github.com/TomasVotruba/class-leak/tree/0.2.11" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-03-04T17:04:30+00:00" + }, + { + "name": "tracy/tracy", + "version": "v2.10.5", + "source": { + "type": "git", + "url": "https://github.com/nette/tracy.git", + "reference": "86bdba4aa0f707d3f125933931d3df6e5c7aad79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/tracy/zipball/86bdba4aa0f707d3f125933931d3df6e5c7aad79", + "reference": "86bdba4aa0f707d3f125933931d3df6e5c7aad79", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-session": "*", + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/di": "<3.0" + }, + "require-dev": { + "latte/latte": "^2.5", + "nette/di": "^3.0", + "nette/http": "^3.0", + "nette/mail": "^3.0", + "nette/tester": "^2.2", + "nette/utils": "^3.0", + "phpstan/phpstan": "^1.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.10-dev" + } + }, + "autoload": { + "files": [ + "src/Tracy/functions.php" + ], + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "😎 Tracy: the addictive tool to ease debugging PHP code for cool developers. Friendly design, logging, profiler, advanced features like debugging AJAX calls or CLI support. You will love it.", + "homepage": "https://tracy.nette.org", + "keywords": [ + "Xdebug", + "debug", + "debugger", + "nette", + "profiler" + ], + "support": { + "issues": "https://github.com/nette/tracy/issues", + "source": "https://github.com/nette/tracy/tree/v2.10.5" + }, + "time": "2023-10-16T21:54:18+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "rector/rector": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=8.2" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/ecs.php b/ecs.php deleted file mode 100644 index b1df563a..00000000 --- a/ecs.php +++ /dev/null @@ -1,13 +0,0 @@ -withPaths([ - __DIR__ . '/src', - __DIR__ . '/tests', - ]) - ->withRootFiles() - ->withPreparedSets(psr12: true, common: true); diff --git a/full-tool-build.sh b/full-tool-build.sh deleted file mode 100644 index 94f37107..00000000 --- a/full-tool-build.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -# add patches -composer install --ansi - -# but skip dev dependencies -composer update --no-dev --ansi - -# remove tests and useless files, to make downgraded, scoped and deployed codebase as small as possible -rm -rf tests - -# downgrade with rector -mkdir rector-local -composer require rector/rector --working-dir rector-local -rector-local/vendor/bin/rector process bin src vendor --config build/rector-downgrade-php-72.php --ansi - -# prefix -sh prefix-code.sh diff --git a/php-scoper.phar b/php-scoper.phar new file mode 100644 index 0000000000000000000000000000000000000000..34f64da97c963264faaf966430239a223cf700b5 GIT binary patch literal 1197968 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

9>;(bFcoW%qFR@EPObMdE=Wxk(%%RI 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 |EMFkZa^OZ$Hzf14M2^oh`4lM0lz4 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

JC` z2cHRIJ|9$Ex6b0VB2r9(RV*YAXiB?tdwe=t%oBua8=6keIN4thAu{LP@2tRtS973wLKue6>Sd ztvy~(_mvvG@H4+Ph}gc93NP8G@P~K3qK)wQpeF<>ZnFfpR)9we`irCBdU2t>etF%z zZZ2lHd?{PzcVs9q*b4~j)_YuhC0R6V+p-m#C#GxI=5Ts!fFLqA?AfvTqIo0Bc5(fU zWPP-7{=(%SCCgK5{NA`hfh&oCY0V6#|0l`1Z47TLbINr5ta8#`%$b?L$Yd-OVMNK8 z99w&cfs9Pka&N7L$-EiJ*t}g#8QB9Fo#UbDT64o>GBQf%w&hx5i{r?6HD+^{aWatc z>WtqRvmuj^G3#2^X!1LgkP$n!Ovkl{$S;$UQ9GMBv!Od?IdCas7iAWX!6fA5PH!D1 zAY*p8;AwU#V-`bO8x3U=GUjdTPaY#OH!uL+PioEu242;Iv#GE+p zWXw5v!}$FlwUkRwgFqC8_xy?*Yyu>tsa2z?)}|&dG+mg~UE9R~)0SkI!FjYA^}jo# z#X_YIVqrrVm~*~+?_q9w={&V8B``c5yDI((mqBDhNcz_p} zJin#5zeF5g@7^vm{Ye?^zt_pgyqQ>2MMD`g3PFgX$Q6>u zbOsHol2adYPi-H1F_q8|AtD&MKoucgC;R06^Dqygg4#V2MULz7YohPFhTuxp0q3%L z?sx^DC|*5#h^A8mvbie;F(v_N4@mbWL8 zxtc?kq}2~7v$iE`wZ%avcH_S&3vITdKUGADQhtN}1+%d)$SB~#1Zkyt$t9Wjc?uO7 z1x5L3@u_)BS1R3I;j~iA6<;l?p2P1t4`GvFKP$h3Z3q=_$=a(p6ki1l0oorC4ik;y4ujzQ2MGm0+Z)RA_0bc2}zq zLK{sUOk&!yt5sxzX|od³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

D#;Ja=Z4hwZ~gq zy2zvt@%=P&Gjr3+(%*YS?o+D@1zhzTyXF-ghV6AD?;YT|^s!Zn%#DWp`;b*gnnpLY zEc(1geH<&yGOF$odGnnVmj(Za>N-js1`RH_H3s*(@e~CS8`d`T##bX2Bg07UuPp6* zIvW&F4Yy$PmxWOt;@rwT@lY+Q#bd&q|4Ax&mDf6qB|yD-h!L^`pDvIfh(62VD`HxO z>Vt_eGehrL_MEtu9t6#xf-v%5n@lpepv{*|d^lSptI{(t8SkGH0q?4wU4BlFq@34# z&{6moxmfg3ZuT6u>1$dTclu0Tj9q<<+o%Q6Yx*=@4Brlh&CZV7=gqJMzTk4ja21fa+5%0F5TUFbtAFpa zIjy`zY;Fm`*isC`rc5x{F~Iv@IQ2ng0fyvkJxfb*H~iqT#`Ct%^jtGn&rLS6SITv3 zw@+`Kk5g68re~jGF*)Zdb9NS6NUia*2|8ATB^W z6S4tU-TaBlQjZKZ=i12Fv-$RP%z8j{@2DAX+>D*e-LJf&c6hgXQE;#t$pylwSxcFl zK7rgKwk%b!;x5}xKi^PyKx}Mk_ z_@1aTK1nWyU?{mTRb(%HTp{%i!+57u7U{rgbef5p)@Pq&u%Edf47Q@ZT0>ERHO=VN zX$M=e*orlOU@3Kdgls&WmA&iq1YJB-*8G_IK*wh84zZ`4(qIZtQRp0n(cBI@+3i*0 zGC)Ada6t640U{i{bndA6+s&e@sZs>TD-U)&pz5C=PYbXPu>p9hHn&DbRE4sH(L_e? z;^L=oHnHtA0!~2EsWppHgkr+&0xScWti5+1b8hXhvAqi@4Cgs~F)R>)K1W0x^xJd* zr2=`TOX&S(6$CVimhPnH{8bxPHX0Tqeq3hzW}C9XAig0=1A;30vD&;KhlN^-gFqOL zP&o>z-+Y|npbDkPiGSR{58S!2dRs2&<-j6DG@)tnd6h;*r1F@Nlw5?BAeSXKN}yG2 z5KDA01@15Swu0f8QdBj_y;u=I(=#!oMt<36*>X4P0-r%@D3ecC)WssM=ahOgVrjyF zjm4I-Nw|g<92Jot&{%zcS#fhU2(%G;n;H(nO+Hax;oy*F2szz9FeJP~tyjki0;SlO zfbcZRaUBvxK65Gzl}8eu?htHqFr`gdg)_>Baar%{0oQDftK}L6<2% zS*Xn#5V6fMcuqt;n@Z;G`B4{irTe<(xaJ(UDv`_PCck)KR4M=!MZ zLNTOf?e|1tDk)3}O!`6-e~>(g@QpW$-zw4`wjf}HBqcCle!qfN_cdz{YrvbTy@(j= z0-|cX?FS&qgoP%uVpZ504k8L!B4T*~9xB9DqJnb_O{6p~rm`(splmmg0%CFA*;M;f zIfsi9{H;4%>O}pfssblMm2sC>QLN_CS5-`Ud8DDjN8pB-#gdrHYL9u3uEE!tS;1Mr z&BhQ)C6l+pqzsY*gF_n+oLU%KE4%$c#!9}=sDAEK^I?)}b}4Y#Tw} z^*y|&#Vj_f)X;8p>v4_4VueXY$|sGH4!KJh3&Bh|OJLnxfn%RAIe0vbr2MJ=7}E-efy|v(UZBjAB4Jy@nqJi zU?NeT{l2I7#vAb92aQJ`E`fD_H5mMraZs9Y)<2)%-SHs~d7w4{;@et|y)_78s%u0FAtUvU|6#UW3%hg8O19op|EciazI8Ytt`G1=)7E~A4dMG%pO6I1 z2wbzXR#$!aifPTY6GqNxeKwMo7DlVomX66ZJ{h_0#(yuttLS&)NYb@*gHJ@^_6Ker zH?BXQF0ERN7VZA}8*Wq^4B{mJGkR6Q{l;J87r#*5z%qXV`u=WJF*i9-GZasJ?_YA7 zWsJ9bbl0M3@P>Q%-mUj_MgatQ_uoB|@`4`mVL^oX03VPO$vBpDO3Cq;KxUzz4!q;7 z1LIA3_?-TVHqpsUd=xGayi&{iT+`6dW*rc{Ivx^-@B8e(wLgd=q0h1X_NKh>s4H-J zmPX<*HH=46Ougvoa&O2LljWRgL<1+!KC|~Y7RaWVfGu+gp)FroGM{`aY6HW>wan1v z)PLl2IMEu$#U4e_7b|(G_{6HJqIaw+u^GTn7No`|%ID0i(2>Iogl-<#aCoIg zwFVt%)k~iFbd1NqfJcQ%ix=GhhM+kl4Wf9W3RZ1IF*&%tn#91Is9pTdL4M#PBEMkTi91h+7B<>jv?_Dnv492Y`{@arw3X+fhj9lTbh z0W^4^3}JPk9cX!q7vFH*`A= z?>zuhHAYuR0iz>Ek)jQ^)KeM@ke+ZilHn9SyFH?t`K1!pF&V*P)?ENCRD_qIOSDH( z$!dv9lTntne+c9DxpTdsNdxb0rW zj;)@iOeE{7OkCyYYfX74ma0J24N=%=fm1vOoO^ikg$G6UHObbeET`;N!GKDf|3f8_qc4cxAgcVf_kaoP7H=(JIndBSV@69mFufV4Zn8*D^V zk2h>es7Pk4Y(}Y_*nBvg@^*rT$dNpCiVB5j+_BLpM$UNl!%Bjra^q~PfPs}u?F+yj z!1Bn)yFoZJ#Tsgz7Qg(EE|+$-6RC3JIYl-1%G^PdjI3|}xm$pFy5VJMiYlOn?9eJN znhp|Fnqj^a5%xD2HFIaxC2DL$CLa-`VgICB2P!)>*%|%3)Q`bDTc5ZkQfwqTh@~Et zdVfWm)BgZ;K#RYRTQN1IYul71S7~KT!;~p5*KqGy9Eqy7oT=U{)0Vr9l zwHua*R%2zn-rB!u3wSXJpv;n|lao<<@V+}5cY5vNFc~1DxhAFpg^?y{U47=EIdAC( zsM2?IQL@98lbl^&c1Gt{mq7JHIn_mX^xM@tpm|wN(;r;*yMxi6K=pcyN#oAd<#5!# z97)?=Rfud4+Mv2S0J;|y=Cyl0pm_D7RV$L5566RUzuO+Q-}bta>Se1eV<~Lx-()XF z8!FIe5+r3lP8=<5Dnrmu(}aK)j=fouQ82HWR+66A_<}R3O6_dN?_|oi_s(tiWJV(W zPRvN4-+vhiGFM$jitM#k8iw>ZT~i{uG+3s!4G28-skezg$LeyjYDH%!Go=>58*$9F zjd)(yTWDr@DzzoUb%lC4o5dz5h-%erjF8Q=QQ%cDAPMb+2(~#ZlXDsiGTeDUNg13> zUzy!}kbjSM%+8|_Mt5~8pEnzyO7msuQdOR|4gmT4T^%RR$ON;n*;K)nVQ|Y0v4x8| zftYA)8yd~L40HHIZ|E&N`joJhAmsN*Bi+)}ar~j1myqWqd?+o)S?nSxp%mi-i;82fBQS~G+9#8Qkn4i;`pV{?( zt^EtVSle#nHV}RHR|u|AD}j;CX3?fdyG?U3ifn@>NSwYTfj~=RTP;PZB;~|g_uo6D zuGY z5<&qkQQ$Q$xnc?gBlPK-uz5u0a1BeKlT`?3FGMs$XL9Mty^5xCOd$ZK&X&ZdWJ;UG zZzGKzKVLoSx98q0Vy^Nzvpxg!oFxc}FZSMvC6(~m-1_V9UXz6WnRiu{8#X{Domt}LZVM&i%Q%F1!gDP8N|PJ#x{z(L0A%hKe9Fl zjv4_QFj*JSk-;3G`E#|{&153sjb_(d-4S=I<#p(eR75E0y!dL7X;_dI4!eKkDj0xA z0YRsn(+;Q@*Iyjd^bz%)! zMCsaiZLQC5jrOc(loPd%^$ho(t-+Ge$f#(gV|ylefRNuDd>D=_#m(PuHGqkXfzBxh zPZXGD!ew{B{>6^0@Y-Wrf!!K zDQ!Oe9b7#0__wCo)XNe|!Al_ON>sb*5RaX0TCh&{6Tdnbfo3`bUmI6dRa6uNpcdS7 z;MJE(+GV_)7UFdc9;?EJf`=f~YCCYcvJN_fQ`ixx6f2c9gQFx`NTfK%xrb3=VxYm$ z4AEFoModiG2{DKCb(b?EE|g)jiCv)^f;#!b@BVV-0wg$E@9T`pIJ@c6z_kPXMy%|xI@)swW z+P3?8-Q-Og4Jqu*dd`xF($O|JtrjD()PPj@vr8wO8xoUH2NG;N(E_9R^EqIbrOUUS zvz(Mza+5Z&P}eR~D0B^(bhEJfM?)Kg9u@vMy0lU5f9Q!*PluNA@cQBFE2?as~K z`@CgDcWT;pJYVWHg%Z%6zEevKpKM6h-&5M}CycXIz$2N}RN3K@;v$BE%okab>+5}i zh`FbCW;l0U-}05}lH`%V?m=PD+Jp49px{Dg;6}HgQImeVF?bGZIhFn!t`VWVu|zrX*o z|Mxn7Tdd|+ZJcAq64w6u#lHUCBxX2FrkJ52tic_Q14#n6TPeebY7ysSe?q)l5=SbA@j_ zPDxeDY{z)AjAORf<#^2{w@J=ukLReWcB@xb(;Ww;eWS@Y^Z7h9^*ex%zq$GJh!IOkNY6^Hhg|sQMrusMn z=kg+3s;?vtX%^u!zLkLgMay_rAMpbYGf@SxW(gv6AF`Sj%sENoeV}R!2oD?QA+f+L zMpBdK`u)Hf*oVN*zn-lwUitZRvz^1&tLOE4d2N6FBLA+fdYdgjD!J8=ueQr2h~-a1 z_Jrdo7h{G|lyfwaep2dmqzGC@Xk{;s!H$mT&zt3_czKBaH z5~GAoEBY86^g?raMg*Q9es_Y6MII%PfHBmNSg?dr%(T?faJbP^ z#kj|r`-I(bfy6F-i%M@|@e~6d3P$s=u<|@Pgp|6|F0Mq2bAzPib=;1BW4qhu?do&u zcAS>RDtFgbc)DErxF**R%P_@=;~L>>1b%=TRJZArIc3O*Ol!|_EnVA_;D#uwt7G_{ zNVr88tL=|gQELyy`3Ox2eLSG*1V<^6!k6Wu)r?6pGS-uzbhY&-y=>>5dqZ7^xo8-mO``%$9Oh_j$3Bzin+R=z}BjQ0}1{0@~^pfDWCY zWN5Nc$08(9!)1*SKXSP8qmr9{zBG1ALPX^?#wGOctYNg&L2gxt+{ale+c~eupJNMn zh$^qw7j<9OtGCW;!{#w~0P5PP@Z!h15zIt3xz^tYuH)G_;ZWkhzHqE}{JN}uU9HZb zV_VI-@gPr0aa_%%bvbll$$)U+IIbHw7W87T7X)743QR1Kif)>4-vD#+RG(Sv;t@>{ zlyahGKkq1jQ%>k^rsy~@-S&K|H*lcf%x|h0wYh9}BD)g|0)ODzZm;h;OvoXjL>w~$&l5q^wC0+DI8k@xxQPIWNm^VV-^{@M zf^N)+a&BN|_VrI6a7CnI__ltZuddpvUUxq}Ul%J`@HXx1Ll(SifY;kkN&lzQu(5%j zZ#ETum{c%BVo`d%d~KYFZh2@+*Q9YHn(=Y@OgxoS(C_2&sd-8t+0EenOZ3TC?*4gr z&d36G&so6WVKXgY|J<=46eEh%^T@W(X;#-yz2eFj`3X28TpDroiM*?(MaR?or~LoV zY$f~WPt98EZ`(Ey|L(s+aNWr%JU8hpUAwMJ*R06qG(nPf1Cm0ZCEDhq7f32;uPr|VE8|H5)A|bmtUd5+8qQS);rRe5#g<|~D zMDiBL6uXFH&q#6*a!fr0+{pk7@Y-^t?Z$GowxZspODL8$ZN0F~# zS7k#oJ32Xzu^E|xpYG%<&ST&mC%ojx!Kr{35`Oz7Fu7!_>JCKuIBXoVi;#+I*M+4E zAgOXVLx36*XdJNu(hA*xzTL}7uI*8XG1w-vMYLEj%)!UE_4&0pxhX{$Abe8{W*Fof z!!WAjn*%XIsRp_kh>Z8q94{gY0Vf{g%}IgA0z)|nkv||mFZpVN?$MxiH{oAFszKN_@%XA!BW%`Qi)ROV{?+5i z?~<&vqS)yKh+fL>$hJ3Y&D#c-qO-2HfhE8KNK{ZxEKSEKnx29}Z5zABpAKi%sunO+ zfGyoC%W&jzDTrL22c$9jbSQjCO$7!v&QDf3%=)fp2o1?lG$cd0cUWyj(nl$hq0;%} zVjbiYm@-+jA?rI-+|j4atu9fB8n()Ri;-Bk^Y0%wbm%o8BquCe*cC=z+kh*E4`=}@ zPdG&(gC@A*?`2NC_DLw94==)D7O^Dsp#2v;gdVuwsoMee9k+9>Um;4w48q0(UEmJt zFD4CmGf38VBSUnGtAVg;mRA! z@%g}R+&tB6HyPOF9g=n>oz7d9WX#G8Aa0(RN+}fOWXVapmY&`SPtwdI@5V?$d>=1S zCPZB1vGM1Qw9TrjPR-jK&U66<( zr3Gmj=(N>rh22YiimSIAFr5n8%h*7Uuq1d5mV^M==(O+Mf(P85r0tYnovXiH$V zBnqqwUB-xuIH<&FabXo84(e%%t}dOB*jjId(i8}GYP3Osi`)sY^>!DsK&7#dTx=GZ z5s2*B#G$Icak*LM`o8U(38~|P%gFOQ`dh7koh zuN#6oGG5Qy5qEK&__r!*y&U*@CxT4;Nl2P^5t}M*-C>}j$@7@dmOV@P3U$m#=wcZJ zkJa8$;Vo>UxyD$BilsX%_omg;J$&$B@H53hbcH=&_TXV1T_wCB$2aTVec7r(#iwir zqxStRn69!D4dFyeEl@TqgRlZ+4H!Ewc?}450YRhGZdEdE$i>T@C9nj}n;;w(#jl^1 zIu^{X7`v&lNcH{IS!^w_)=O*wISVfn(2nXfLtU@dvZ9rxtX{)5EMD~lB5oQ2M#*qc z@80^mcv`{w8719Qu|}bPS>tZw%UOx*ula1F4pf^{sGx@8FF)!D4iX}`Kk@*A9&%PL zH^7|jtbp!=wGE9dup1+iyYB*(tt-bHWPs}Sj=1`%OV;tt^(D8L9@hn7FTLfJe{jw^-Job?|PD0yT_A@DC~7+R%~T{re73fHH8^=PUWX4=Ur1PK!;q z2d@XQB*bI;@QriyasOm?wD;CI+&h>-RPAiN>_mQgc5?9k9c*~ial^^}yZt|b{t3`m z)_>VM-FH45AMc;Q+O}qGcJzl_+tI9@9h}YfGYs%imw!E)y@l1s`c)~^IXyT$mOP&5 zsigRl>ZzVe0x7AUnemiFyD3pkS?>?teK`4WxaWY@P7jXW1DXA7`or|OEs6gHv#~G8 zDB$ACOUz9zE=WvHRR{lLOljx* zytK@8kQ4yTm)&pEFc84s`&U?_QW~j33|^*xxx4h`>m*8gy)dWZrD zNy^PJa+olM*uCzBsmOIvqO+}7z;d9CVuGSRFZ>PBog~-Eo=(xhK`H)96tyOP7lQC* zQ0iK*s2|G!?C)nT`u_9bh<6z@PC#k9o3En}83#e)d(rPKAG?d%mm*|z@Cb)*@*Ood z)&c6TtW|=ky7eRQzdgod8Dg{7V7*=@dnr}m9-}W(@;}q)lv2=UM?6F+QXEuM1=Qed z>j11E;lzg+MCX_>)468|N|`T}0^e+uO%epy$g-CHms2jdG-z$5`@yQ!0SBVGMcS+a z$PM5OnX|6yppoOBntgj0s^>XZ#l8Y!po`g79cC>6DiuajFcGNj_S@kqxqZU9T(+dT zg(;gq+lE;WwvFDt0)$avTU|FOOkg|7sfn6%(?aw&J!})E>gPoRR0~m7PxiL;x95(? znznsjHkNA}5;0_7NbQAY=j9$wtsN-uuw78C>OM1npU3Jm0RwAjGWI;jcOql z*>i)%cDd>aiDHn!h=;-8fBx5RKmYaz`QP9E`RT*AUp{~O?$>{O{rKgVk6%xJdH>;m z{qX(IA3lHj^l#t&@%s;-fBkLy`L7@8=Pw`MfBpRFPv8Cb|NVn4{_&?@K1KQWU%tHm zKi_@NzifUZ8{PS;r`}n2$`01x_KhwW|{rVIA=dbU-y+8du{`QK7oN37~pZ+l$ z4qre1{o{vkpTBHB|MSzgIQGJCUFUuO%cpPIw{HRP$MA3Wmk&R`|3W{Gtqs4qrj7IV zeg5s^bQb*ad)LhTpcG(MesI{f$>>B6hxUw_XvT9-Hd z`tj>mH-`Up&3^s(&D87%q}lgQSt-E(@~hV`{T#-fM}%MhD>mfow=W;ReEIz4hXDS= zfB)gj$8Z1q^69%D+~0or^wXdGU;g6{@|3@R{M#>|KK}6P@X!}sS@fsF!*+XW-o5&_ z?{5C|AI6`bvaT-cy~8X_%q}adB6pCb2|3p9>gK6-n145((``?6Qx|q)93X4k>a;7n zesHk2Hy40aCb+k6ZCq7m{pl|2i_^ntcxj7M(REEnpK^0!H#DodBFkS++orCI?I7QN zb7OqI6S&K^?~44?90x(JY~*pbD>~hb^(Aao)cfIHi)>7h?S0mrvSBzUb$eN=*Z9}h z;D@F;_4iHZKm3g?BYjym_35r_-W9b7*t*NJA)9~2!X6a)OPw9ct<$vouh#U!)^t%n zmR(aHih9rjwx)~cw(MRs*4Fi|C~_JZ8f|NPUksOEy z$f`=@Y;^^>{*-lHruDY8_13@C+qNOmsyw)FbH-qM?{%`Y6?n*=d6f6(#Ox`1$aSl1 zl^@E!cb3{cwyj=V51bxE!dCd9-%pL+($*xSUBBLy`_r!J{Nq=)9%lll!(QI9LTdoa zrGs{5>%!xYb?z+T_Sp6QLsqsPcv2h(XOzkxefO{I?k9B97Bzo@vrJFDZjTTwH&Ze#0+4b;>**x1_f_<3_| z#W>^ae4#UA?bhz`zHqBX?o{8sn~j}YyZ@coaWV#O!J6ijx*eMNqI+vAB+AHoCSx=- z%vMPhQ!lZV64CVO$y~m*HPe^-I;+Sk_Ji|;B!F=ewqm?QS3Dex-u3ZzTeM-2zqY4N z?^>4a&yC5~K%vopI3s2&bm+?co>sZ09=fJd-S^toQ4q@A=V(9qwXL5ZLhGtFBqC>P zD#%SH+-qA+LwBsVnd@d*^OHWeRh3GO!RO5zTTedzOaeZUvHLs7_@#>Mf{56?JrNl_ zo;P-P2br!oG((|f?5=*wN;26)(YZBF_4Ql32cBt)&aB~Edz5;CV^8B-N!T5hxEF2K z_ov{2zeNt*RH)3|Dk);viPNsk_^K;iIg(Lt0>Q7FZpHHuLMqi0AOQ9<^ZEVulF?e| zH`tTFkFdZ*6wl7N=t*b+Xb~@zXNS!Da|^(7bVc7BJGbDrUE`X65WKDa%zf>B;r;xS z8(9FxV;ui#X%rz_{lV^TD;hDe#})f^Zkm;ubvcs!xyY0(dOMq2LB*?0e6?d+!mIHo<$mPYh zJdiO;<$%W_a=WUbZ%U~bP~?p70?VMto&7Ex&ABP_Sae~^ z08%9ab&SnIfL4ji<|UvDsh#aAI`W6wtQ*R0*=Du3E`Wnk*ty|b020QzY1_s*-G}ly zv<}399_;LR@aq7iG2$=9X`9xp_%55*M zplT1GbMi{}31D*Woll`RAr^qh@n(EV#4iAq<1OS|1g!V+mg(-u0`NKhEpriDw`G|$ z2ky14ix8_@}$IHrpq!0Gc}vyl9?j7hG>^7c3}hb8%~H zQZ({#bide!6$;Qh0_Pjz^0;h?=x5c9Xrd!fKMFt-a3 z?FX;tP~_$DaFs}SylM*|255Agr|}nn7&z9&bIXCJe$8ddM(7SfUnXmuuaijFLu5ow zxR(W>0+i5%e^~%dfb1Hv#55pzqsk2!=dY0160ic?(W7Zw0!lz_(kJ$931|T&qmA4W zPy)emnne*yKnc*->zHtf5*nJWE2;_H*5S^1SEv5P&Dnz%K+zmGr)nteL%@J~ZnE~2 zH$$yw#uCQ%P9S?Odksf{y@MaSN~3Lc@wdtrX&&~2mLN=4>YZ<_EtSyX!FfY`Om$k}u;Q>QngmLP0B*3RrT zyVFzSx4Ts6z69ZZrxPUNHB+XWv!8bSl;!? zGr>IB_1c_(Fp`|BLrZ(Qr+wEPWxW8=p~Aa4ENGNrqg*$p?PSV=_%IQ1ZeBw~kC(dA zM?Ct;1LDK77RTaT`p6Oli5#5FcW{?r^Z$?+8fYtxH?-1VW(lH8g7<}Uq>qO?9pf%h zoVnX2F4z+6^*ckpFNp@6hU!ZYm-fY;)8)L(k44vr2-pH>p3bcGAiR9)8t46zcmGJi zfH>+)5Lt@AAy4tP#&{y6{s9Oolc6`}2rWTK`TU@}6GW4J$61IP43_%f&M7pAC26O7 z@@!j4jGjIm5cS$s0!aiqZqgFKT55?j>|BCGf*>}_c3FZ%0v)L_1EpSt@~pVG+|&^x zk&bJSPQXONknOcQ4iX8Nad-aEOS*Ni1W5$ST^m0IFakcE>TDkD@-mmp^#EZQpcc0J|AY?V-Q>&|(a<2yjM!0uR2yXXxFieigKM+Gn@lMfL1WhaGc za@8Kdm3rrHZczbKQaZQG4W;r&9`tb4dLrkYw0-hv%iTZ3? z!w+XR!*p;1E?e%?)hAPMbvW44rxwI$#?V%Eu#7EdK|&2IS46R#oxW?JxKDG~|$ zdrQE01c4a7j6#6;a7(n_1YZKmBTgT7-;XWr>jx>MY@g_r(j-ejcsM`wkk$D_Vgu(oubcJqCi?J|6=sloO%9B54)KgmJwzPbpj>{=}1~ zdP97L2$b-2@gf5YxdJRo;t}$&8KqF*LmE-v0Q4;*lE&A3K!R)tZp$Rca|P%fpK~(T zB4BnBEl#9>6HP6f91~dqV&|T|eMACg$GJ&vu^~6kpOFv&u%f#_f!3aL6yyrfLVjRP zqooyKh9uelC7LoN1d`vJb4jjGc5Zs1^adv|8N+}kio;en3TQnYk(?zyb{d%T6Wclw zMAkodoxo?!B$-dO^Ww3TcZIgbAiE(Pt9dH#1!}ARNpByo0P)oA5}>VU0?w>1pqvOl zA4!0DA^|r&4jPR)z;OeTnotKVlYP{og39z@24nWv9`N&twJOt4UpqjMT{#zUPXB2)~3^a-X(H~cl2`X%8tJN z3XoY*M(N|i9((AmV;{dAP+9w`xyveXO7hNU;^>G?8uRxjw$sEe(GZq~YVb868I#B$v>!>L{V?xP*Q)!gKJmm{lfCsB%Mn*b* z0T1S9RaHFFejGE)E}jg6fEVM&&AtY3V|3D%e8u73`IYxgmFokTD?pRcf)}YAO1^Z;3003 zkrQHx44n8R;{smNixxseSs+pLcF5`yRi=_t^I})lzMBzU7HpU@dDrC6s5aS}k7y!a zw1}bW7O{2Da7k{|0$`Od*!Rt6&NyJ@i1DQJ`02a{d|ba(nK>)K#l0(D_-H_1 zx`^UM%K-nqdufNpneHxs$~yfCD3gg+wzA%_4V#5XfT2qTl?c#$sY6vj%Z<;TIO2en z8)bM+O)2{oAm^%_5(S7Bo66XVpU8}%j|kcWfCcHi&r@o_0b@s#J#c)Huk@1=aCRg% zWq(&Fv8k`7bf}U;oBR^LPc((7yWL%{k>IFhUro<`t^iy2=e|#x0HQYc;I;_r)47)` z#MLEI>P2W@Kdx;jXNT#aP=9nmAIYr&W5?Pnobld;w8zKBC)KPGW9P*7M1WOuBJ*9YHQ=Q9h$|i7)~0<8C?{r;`9-QlcK7GUF1sr$dc$OWTEhw{ z&Y%q$dEg<3XbpI$zH4-ApwcEw()x0Fli6qktWnHmo4(~@K1?>INUA5~)*_bPL7jR+%;_axSywluoXcv}%6JxZ01Sp%klM)WD8^gKai4^fI49H(N9T zHxS=8G5LTW@FMhY-4h_NrfemddSWgGf2pD&oqgk0>G=nO>^vQFAhd3^Q9@ZR!EQ`C z2W7fAgEvd7T!Sc@3aW9M{bavw4Fc-eF6Y?|u0yrd6;`k+>vvkj9{A!8Cc)zx#L;)D zB>{o64y3{mWEl`S%McF-YSK9mB4Ii|S=2O#JQV1n$&dcvKs-0L1_76E z>u^2A`v_;Gt}x?g2&@eVR>zG{Nfvf*7ZFgxlYk*9X41eb%4~&P{;9$K08=kQmmD!U+Lb!d8+0Vc{b2as8xYj$gJj2^>Oc6ef^|Wq%Tzk9h@jLR z5t#;y8x-E^jF(igAlTI*(CI;U0y#~XC8NGEV=FLwiC==-KWQ@L8$Sk~Zy@Wacf>a!Ph(sq=Hn0KYUn-Qu?)Qv0XaI` zesa`x1F|%NXQ;qe=-MCt?1~5f;nygAC=X-(_YKI?;7QQmPqq^_fIH!>1lsLWXneAK ztUsBWP(Yq=-t;zeCZwq=4mUP{Kw(0Y_ABQ424u>_I~vU`-kwag|aiaM?-Uf0rN-T*nHz0>2ky7sg zt9L%FHNOGb8^H+PjkN?e=r~mhPwXaOnUc*8$r2I~pnfeP2|p|XSf=zX_u*K>2GC83 zh))p`8RWpbaZ**{f+Y(rAfM#GLHX#GOV5{W0Q01Hyu9oqL9zi9(tX@sOlBouka$SZ zo6e+$Z2*-t{r-@5y8)!q&P_4rT-={&A)uAQK7LzleG}bUa*{9@C1eOpO#r|_ZD|vq zN))t>^A7c_0jU^W!DZTt=WQhg_@me@s*mc$d;xwfgQ}#mOrJdluIV{MR=22Hs+Svz zgVSo(y{G{27L`k-+bYVtqwBzE5pGeXR5{c>7Sa*CZJy%69n~6mB#3g4bBzWGrN@f& z$cvg_VMdu+&fL^@ajsN+xobBZ6G34vpNRil#otemblGgXDSn7);)x zqNbscwcxgEGPmEf6VUo~0Eu}m7Sm2#D1V$ONc1Ms&Ut#k3 z(&Te*SeREcd71PL_O&by&QxGc)IaC%_?lNdvDRiOc_&9~%&FWZwbS011@ponZt5`E z7q@0ou>yyrwe{ld+B`BG@Eqv)y34EOYb!`>npjJ2v09k7R5)0zClslQvaIZcn9i&kn5E4Kot;W`LXU%Y%bhw zxNXJ|%DQJUKwRY9N#JAx-xWpJkFwiMWjNip3d~TDgZV8XU?x-@Y#r;NX$jvzys1R{eX_c_>|OSs=>5%|f0tHE8UIKG{_d$Jsf?yL+;wtJP++Hq(IpydK3#)vsOf{RWLW^|rEB z8d$BD3)fKaeM&OyS#bggEB(!SwOON?rlc>s%_W7o2~WYIc`Cz(~{^kio&doI8H`o{gAeTE@A!->@Th7QK8->(BB1m0nOtW+Q07 zd6ZzF(V1h9RKluI5MX!&4x6=Y75fgv3jyjM`ZoN}a5b*;pmui`hM@yor(Oqi4h>`; z9VA^qtgIRb42InJJVvmowUTBC5!3A?CKJ4&UWI20p(}qo}Hcwu~J${onx6-KELH}SFx5sdj7Z~m^FGG%wMmO9163N zP#j#=sil?IK_k;6>@U~1#oSX`ivJiZpCc9VS+7yZ{xsev(M2=-5lbsI!-)uYOj|v) z1JP|C={h$aC025V6Qc7szPBZ)G|S%lM!Bf<$t^oFlB{G5k4G;ge4p=N zodTK&`4{ncvGO;Zh~6j;HO;LYhY37viL!{@Ls~?g4zto6NNche-MHrO{B;r55gmv2 zk9M&R4JWaqW}R4vPi{lAIKwd9;7J)qQk_{yB1p_`HZjXc1POna)R=0%wsJax#QaX0wM9Nfk>nQCwUyNo;Iq^Y zv#dpYff@p4Ns9pHqGu5d7EAfs!y)U6Oi5hO8m}Aag&<}nu+}@u!p(Qw%=GiYY|C0VjCsWHltH>yfF7CVt$Ihv68Mw2k^2t z8+?%~yx9P~(wnX676xze&Fp?cg-eNj=n4l-*O=KDowr1u;;NB~^WLWkUjdYzRVOlXyL z7Kkv}Xcn)3Syi?WycC^@-iwMC_BOGzy}`j9WKKrbVD z3DBBxlY7oYjDC;AxQ?#E-_vh^Kv1-=heZ+v{Rku;W#iucUVgNp;&;2>(hm@JdZe=1 zeEK#@JR+Gx&bPwXep`UreaH(S5Wf$99bI(62Q+mbx?duZ-2{CVIEPy*eEA(8>PkM8YLMGPp3%?}^eaQ6?MgcEzw8}>o8ug ztv}XkKNUfIsmD9H!6$TsKaH)h7QtLzT0FK_A&Ms#e)PerWQT|Up?>9q;?lCf+4kZR z#$Fj8N(SSBZ@5s|pGH?^ajmkSb9n6SPIG^6yxU_Ver)g)#K;>nh~Ge_%UJZ?-*bMx z;dHsbXXW!NbB~|9^8(;Oydr}x;1;fLs1FRM)FGbAI&Yq+okoo1RdITh@oX#1Kj|b> z*Vfx3_p0SlJHY-()S_%x+MQoZAZG&}x%aJu9GOqJAKC?o2f4ZQce?{=i5CuvaCRp? zOI1!h;KwIfrzGTx824kg_gD7V9XYi8O1q1~eQx&G-*wG9!QfFC79EWIbN0yFH+FC4 z4}8-F7>nNXmAb)$r#0$}xrOtL}6P{5Y-e4p?|0wzGOBVhIySDwQzt;?tn!dpo@6Or+lw6#4fj;$&q zYi$7U_`9ZPGZ!f~1gy^fkt5LBS>9dBRob21*#>PDnrX zl}BY6GJdX3&#`u;15hW>m?=60{@q87qR^FRjoQP%aM&maU3=Q7J^YKujoRORy1=Vg zeTAJ6)c(F)bN-5HU;)g17?erO0us#$|NBn+w0zd1tEqeD6YDsP zXwXUY557ZVynQRy$ohR!yafn)CKR8WzsNdyc3#Mzl(1!doi{#m8%C40_RR2i{``(L z*Ur2k%9v{rcNw1mR!T7!AwrkVknzEw5pOO+gcpmaG;XdwJo==9ziNxQ_z>JVWpot| zr41Y&N>vWlUV6@msVXV<0yL3(P%i^Z(M(Fc3oJ<_Cac{etH+;gu-7DhkF45{y=e5p z8pFMP&iguTFKB0Eb!8sBw#isPE6;PwE*l6g2*DE(KcqU|E^VVsh+*5>_Ll&4 zG2E36-~b8Kx6igkCO}?nYd-Q~tUZJ|=B*vQH^YTKbASi?QyaOKhN@E7pUXv=nyqtf z?5}O)j-PB_NU=`)vzu`s8Xw(6CI^0ZykW~`IUOpTAGZ#_%MN9DjzMJ*%HKf;cut3^ zco%^kaf{`oo+`S>l23D+6%>XsCuAX1i!o_3*%}U&nti2Dv$hc7xrC}z4D%(%Zme=5 zDV*vj3f!9inPlk5QL-B=r;1?n>(N-mDioQBIstFxsRjJQ zl~6i-H}-0G&r`!s&PwT&-HSzQa#O(l6_-w%q&z^xoFnblLOIB zkbaWJ3zl!pbw3k&epgcI{m^vli~*smBi-LJ&OWPPu)@aYTJ-k>8!Y;b#eXZjoJAcw z9dwPCh$Gi3T&%FPi_Y~Q{Yf+@WO*KEgrZh0a-D>Hiiwo((L?#N49DtP#ySN-GE|Z= zF`HI)rUu8p0wy^*Xr|h4k2o6fKGk3x8sG(WKVGADW1X;Yz`{A=QBhW|vBQPk0%+vR z{ezHY-cVTiV+55g8$RQ#I=~)Yeh*@OW93K^M&E9UW2|g)ho+$I@2`&jD0Bo{teAjD zm^~)RD?QOQ?Ob&3S>W~vJ2bhoe|)opGdvHnlGr0g;57~3RK)(sLsQeym1KI@F9>F5 zwDn;5jNoxev-L=rUWT|0iWwM7v*076`rb{+?Ym+KS$xYI>%a-&#qk}#$#UxycKjr} z9S`b>_J|P6JRcctvg-k4!wHnsWI9ycRLl-*AcR97|58(T|M?`SAyueZlw z6d1ww99E~T#^ucZv@!vP-Ahz?W0 ztd>lUi4^S~9}FgJxvxnR(r>^u>56UHN?l}+wZAQ?g+4aeo&br!*lc@QP6TM{O$0zJ zcV98*GqwgqvMwfV4uY~R>2sG3IlGS?k{1qj|9USnAYOHWF*SPZ4KS8C>FDSWZY?Z! zq0ID-4byORhPiW2Br%hg6O@XD@>nckC^VID|7Ni9ttptPYl|;nC|9}mhEh%`8M7v! zX={S^M8XO6g~efzK;E=NT|6Cl#1x^d;8l2kH=J2TegfAWY0(O0Hr8!;Wpet2>bCcC z@X?~7O3iut=UK6x$I5wta1O?bjmw1S)L&(VvWY}imp=wqZDGaA<;aT;_jDOWBdngS z7$!MGw^`0YIcGSjVNS#f5J^Ign1^lwAGuBMP@o1|WN67`=yvBOWhHs&7Sk?{hMo^I>tZhRlj(?2+YVa(@}9#f1uzCix?~WftER zabC?!Ybh6Cf5>}Z?SXY-?ShnZcG|(M!_sHaaWq+5rAj6aJbO@kLOaW|c95o<^!JFS z1hlTI&??9{#bNcfIpm^M@;L8mAN|t!x=0BgMmO`Hz8=LwAcuO9dZu4 zC3TUF8ffVVR^!0(qGtkBCD#`uuo5g%8LIf;@jyil9oTeT-T8#iSLTj&ITHL~epu{_ zf(9#UZGe=SzpU&S?vxJG6bQ6sd@eF{89N(wF==9hq>jB4r07M#^cPt`8q; zgWDZ>U+(Yq__IHpwsrXO4V40IQ91;#^Wr(0U|T!>^vCF7+HDQcJ?GBYeHn1AsK{a$ z6QpF0Uj%xsTO=nV-FoGf^>8eXKDW&tcI9}7;uuK+XSE6!Fo2LJB&3|E&Xy|0YpW|t z5OK|kEY>z4fg5IdqLH;fjyJcGIL%hCq*BIlVC$F8E9mOqYKB=!2_%*AQXfhxEP!`U z#nqBVgSHTqvpN}RZ3lYfzH08=H&WUv!7WbOqb1!{Do8@0^jv(ZtquZH??pGqqIx`* z7ZGwXti1z|Q;UK{2t{P9Fg`ZIVrRX~Xr3$pR6wi0@+bm50m&{IZnBRPUYujuzZ2cz zP7Z4s2LV=og~uLiz8QA#Hw^H?1A5wTxTC!&1nXd% z?ThG!Tl)rtD>}YVj;|OC{<1xS+A13e|H?ivK&VL{+s43KnHL?$0DIuz&o5zZ2O$I9 zn;Vp{1h$Cp*QH}bjDydkvZ6i;Wh&w#*y)sJ1Q(qh8v`8HAlC@N3*tYItlLnu6p)xB zmh2*fVSn%y!gQ*vmG;`L@YY^D)94M@ElKcP$C&W8vID-Nl8NE*w&B$9_;lMk2RN+) z@#*%Eeu$gm%J^G1p`XQ%Z?T6!q(VR}FF9N6KY->^{zgJj+Dd;oxagB6pcI_!!$PnhPtDAxgxOtoiZ4XWs#zEE2S_pXwAW1xjS9Qb1&kQmID4&c-N`D%4&r zM~PIQ)(&?fGEpap@J5-LHf?h+Lc)D=U-L^Y4YYu-)$w@{6KNst0>)n&n1Xk|I5}lX zgan8HEhBx#0^rNZH!OKk0g9MVMfT&IqhHW&AqBSnrZf;vP0-OLLJdhJ0@Y=0x0f-y zEjmW_n0CuN<@RxvjJQ4k_9qfKcEFvFr^>3>az;_;Nye9G`a*auaZhq1As0^iG!pD0G?cd zB^I?UTCZJnu%q55E;@LgD!KtWfD+g=V+2?bg7PJyStXnGW=f0)yRYBA8_kM6g2)1$ z`m$zYE_Z5yd081z`(V4Wn%`Yj=9u||d3tP)WR}{|0-o@nE1>nbGvRpJW zfc%JAa-K#4<3B*Pxdr{<(G-y>4h-yn#|$~&ho}n$=`A@~8hbh&yRc*~0jG29vpqV0 zSf+_~kYd)C0WW}Adn&7(?>nN1Jf`Dvf^~C+s>`){ucQqn0tIZ?Qrbq`tCiAntM((1G_J7a#F^z6u;6UAe@){ zKb4+_a-Kqx)HEY(3D)lP&^OOPutuUeTD_J>70u zJG+dk-1la+D=X~mXE(N+UXz3JE%a>rCBMQVG^l^;ml0@|MsYy<)(!hWUN3dVCZZLt zw$=aMVp}~d>xHU{ILWx4QA*0I3&lY+K3-{$%2s(r>q2YrD&+om)vJ<0kw(tAv`0UI zUnu55j=J10CKbm531v;!2#@7TV9CGp`0=77C-wgTjal7q+c*+`-@n2S#q}2G7NTs~ z4(<*M*G zMmHV_pq`eWq;!8TW6+*VlND7W5MxNIDu zr>k^J)q($1VrOjHY&I!7s}8u@=)7EJ*=iL@ms@@hR+ZYU4NJD$NY?CSb1h1v?{>A! zREkWU!h}|&BXE;!r0sori#B>eX1ZFJ70V-5}!}G$l znRJcw)8!>z#GAb=Y+1;XHBJlO+-P5pS&=0f5o;MPDKZ+Zkuc@N8Yj48sEg};MgRx< zoVU_d3~HZ-nxVF59-nDY$^vBB-M$(MK2@TOth5Aa6M2oJXkZ1UYLYise`#%a{;fxRxF~qCbMibF$dlj=rw|}clitDR^dziHyj*qRz-M|FdU)W8yv2Zz- zFMXSsUDLE!m$`DIotGLXy<^G*Zc-+q>BwyQvws!#-~8ZZK=(-K32e)?DtCg!14! zHX|}e%4GgoA;DDxXYfc-mn8&O4Muz^t0I_A0ms1&2;LrYoCDTq(nV3BPGqzMUU+Jt z$>Ea;3^kO~z{JSB91y(L8BY6v<+Z*bD%6_X6QplcP%CimNtiE!R!c@WgHP>~3{VCR zI}I7Yprw}cw}F)S6)5;}M`C0-ffN#IV4#7F7~{f*m)cH5=I}P(-$I+{Y>C6B`vXms zHBgwBWO8(jDY|5~bA&Lm#QAN0U&*}K%Ni=RQe(R~L$iatErK`;W|ZkZa7C3ev>=^u zv`2>Q>fGM*Q)2pU>H0efLzVY>rL~smD52wsu^iwWGU$Df$V7KT@X0}jeM``zl_L=K zJi(_b@Tj7y7q+cX;|=E3q^W2KZdzn?Kn`D~!40v!4IFGi@?qqRyD;(^G(De!2{8?Z z&;;sfP4Fh*>NX!MBIxKmB3MJg#w3Co_xlpNgO_vcwmIpqK?sToW&Iea6 zYJ*|;FrN_-gc+xL_`T-r`q@J;K51R}v5qC=2Gq?SM6n6#CT9VR6#zKR)}FAzNd`B9 zvb7&euzLZji!9n*0BTG7<&EsqRiMlh%`tHg5T1g7ytbq77!Ekc>MGzkC5r zKE40)?cvShS4a8BtB2F+=>)(L@aQI?^glk#7RE zvv@qdEM5WQ<^7)^)cI1M6%T!VJUsyR3p=a9-?dp=Z{xNSe&1hV6b9M?YhaVTwB7AN zp|#~is3RGYot%9l6q#~_$dVvR-Zk3(_s)=%EYY;+?7{IvVu{~eI5XsYG=Kl2cq(4O zCrU%cM!`ON_1CMSeoT{S6y+JKMy}@)-=41hz`3_a{~29<>W|NyVCvo5KAGNH?u|Vo zOKWu-0PtD?dUwu>+}S~3-Pkz(P8knY-jaZ^ski(B!@nxS)?$IyKd4f--UC@LXV!`< zeXCk^J>uNBo{z47P)&*vV*ht#`>wS>1y|RqVaIh=jOC%rKsBhXG+-JrPDLQiNr=qZKVLz;7?dM`=Q{itK60;L(81vpCrjnz6d1 z!_Z9<$0oxx%<5toR8nxv5aN=uJl)fc$@kqZF(oUHo`(^2X2ygYgDd!48|tDiHeqFm zvA|ppgOXj5nUEt*nOYaz>((8Y@&FOBz9_4cQRTr@S(k zk$~m}HEdS`7aLYugCdV~n`ET=mXSCw$tC+mD=NS!D+K=OP=JR>LjrWYf9*o!4;&br zX&OHC);r!e)mCTCW?VpRb$3n>IPMLMyjMwvy|6{!RQtbgFBjI75B;L5^JY!kRD1fJ z?ceZ$-%eVzJ6||cVe9IRmM`!jH5A_GVCAnHK{XT&!@w~$8jcIRV2Sg?QHV)D6#=yM zO`X!yl*s6+PC|5bG|iS4RM%txMVh*%-F%}l%IiQiId>L%YUpbWuH8Rf@4;;iYCp#f zc%PA$*o=Akz8;OMu!N1I2&*S}fQ=wQCIA|PdnBv(4%Q?=dIrOB8g3anEf&U*ov<-M z>N4$UCRwgiu2XnkJMgNPDCdZ%E*XW?dVKIuXz6 z6yMWqqj{Squ*YENJ88g)>dy>+<52e$U`&{XX^x-i0j%xAv_1{dsqpqhxGU7J4jt|6 zBQ#|5#UbZ3bd05aC5i<9;p4SOKY*AyVtJkBjEW<;ymYHI^Dr=qT4wvn{@3CBy7f5$?^F^Cjsd*XE|MxOG z>zt(8jemo?ml_1Yz>ibgU$C_t13jo)lJZ8k*bTBgYvZR$N{6Hm>XuY}9GCe{>aTM7 zMbG#141JQ zONi_!W8s#{4Yw!Um&9|!n3WNc!W&i*qy3(W_F&OpINj#dL}pkC9sn90_zauRfn*Tt z%XMmX_b9$J@Q2)D#KzqArRH_adIO3LjrQhPz|~*sQgc8MrPL&VvWC9!EgQ1Q%=Y;K zLT6lqjT^dgZU@uK=#LaF?}Bu|U+kQD+0-E0UgAvmz%hnDhOQK|mQIi|&vA2*_Op6t zmgS6*S2zly0@*~(N$Xn1`s`VjHH+nHb^=x_aDl2!C^LGY%4R^mWifMNHLO6DKIC<_ zg$ipV&GzCXrO00@aQNlka_N+2TT{GML98>8-iu0N7d}&N3@Y*^{&6|JdA>+2EQ<6% zD*CN52h~Aq%{BDcDUv(e7nq_rgOY#677P%?k!`pV8Xs5WC^<@KN>+^@XdPb z2oJ8fGjV?kq58WT`}$f&8{x@~ z@2!`8FSzJrTjq6PbOO%)zRnTYYEG(cdAlTv5_w~XkpX9%`4?jQzUTAs7Ei^;R&BD) zFy9cN2{@O;hY2mqTukt!q~}579ei7TS@NvMY*HNx{Th%k@_F_dp^ux#LD)Q)2SR16 zcVOvz%i}o$FEg7M;fd}75zoiacI5Ihfqg$rCl@Nf7<;|UhfCfn0`>DI+x-w{#LcxUW&uuhj+S+JWRo~wOR)_Rr_4t zj;PK}fSl!^O8n^>9UI2+djc7h0hqit0O0#!pu9!ENe=^?O9epwVz4dm7-VjSko?L4 zaK8=XjyDh(^*6&{c_D#FLxPU?69_gWsJX5{s3Awk+Y1D1Gv#_SyD1~>d^iB_5YE*Z z2Z+X@^_-8(dj(lms<+U}XX}N1ti3k_ASgV|qV6I@DQOmT7bMF_dh{>FSzB-7I23;8 zSMX46sniE9<5iO2xx2VF9*C)$nZ^xv&Kv%l8J{jt#xP!`4qgr%!h~XyXK}mI6C6VE>B- z-)4O}8NM`H_4a9tGZH5a&q@gP_Xer1h2dj3?v1zC$!+42G`X=bG{OoFA~qB7Qs;3CV*#)@K7a zMniEv84wx`#xl1hKHuag-HwS;}K+|sBG<(Ozr{WpuBN#!zP1#lY7Kjox{O|40z0yTq30s87iC9d*Uq zjBDmh*VNbP7NT~2n@%}3k%P|3e09dADn^rg5He$loFYm21!x1xvjK&bQ=!rl%E3y@ zq}}TDy7k+5df0vzk!Nx0dsQo32i!-PU>p80sI;Z!BFYec!_>iZht#fqt-_@Tao@YFfZFX=DaFM5sfw)?hHtYT z_|7^RUVgIU8T}vSe@1)6S2;?6HO~nd3wk3VU91H%Y+Wmvv*~!uJNMrUMAX2C>C^DDhWCA)|SHFP1X< zEz61ATmi)x~@=B`5`~-kePd_1RGs?3Zk-iW=se3E{6$}*k|)fS&7|jw;Q)8ctx;f zMR36+8$ut9VZm#8N~We{Qc5YKY8X^XeAp-_ReG47@fOUaC8rxH@ple#n{byKWz=?@ zISu9*R&H{avuwJfq)6hYm`5SWdDA&Kj??cuAV#oT6UTxd(&G|Z^zMg0q=}~VA!NMo z&exnUG>;YscB_v_l-&Gobm9Vx2~KH>Ji741U6dji$HF^5^6ati4Lr+<7=0s^3|C4u zr(SbKgzE%0aCov3eK&~z!IVllWFdquq{|goChNutqNa+YgVAAsELs$R5yf(Yav>9izmd?dr9N>S zE(yPqKz9ahpoL!Q_fra*V@7IeJ-;4E{|BvFZEvGE5dOZuq90ajSE{OO?_GP+i6*p* zE+IJ}+uKi;OPmBP0nV81zUcn@+1P-=228U3Qm~(SW<0jX;|YKKnH{oM{4b1Qo?kpz zt~*PU1cf9@lULtZPgXp~QF!tC1x5P1EFeJfiQTyQ4Qo5Cf_^j*>mdAcn`h)H^7YW?#lZ7(s$SxoY@m=vvxE z`vOA-D%(0<(GuhbI;OB70AdWO+N3yw7=A&Rjgvogojb_WVPG%9kGJjDyX%Xao153b zjGekJN0p6Xy*~jREfTyVRu3|da!wwHUKxSO7UJy$XAcvd?QK0h-zVkTqDwb^hT%u9 zN$gSf7$sRj#B*8@{!-)!gNo8|`;pp-xLCEX%NOv8PO1_g^wL~WCC=Zb z$cv$HaqdDkq@i6*MF~#Fce}t!98SOvMlpz^V?-v27=gv1qVrWwgLsjc=^Uatm7sPs zI@1z~Xc9$8<5RR{YcD*&WX}#N*sP-IEap?F%FSP^8 zGBoK-(yQ0>A9b+-n4TP_=rSBnFrQ_&3CnDc=@BKQI8Ku?9`e$+jc^Ig)KmNskT01T zah+=zqj|1n43~0>G5Ehl6n@Nbn$gofG@O7&=2#dB;7S3_zGyGCn2aM=lDBhl81VP6P(Opqsv*laK ziHKFMn+fKVl)zYuL1xREONo1hnM9d>a{silNh3iPDPX)$aYPPg0fy_#3H8i?x{e@K zM1&*j^wccRj#08Fhp{BPEptS8ujb{qq6~63q^^!xBN|mHaXL;B%W#wsK6Uy-q$_~w z*`FSxuc+%wmXz=&QD{-hS}GTUTlp@^>l{_RW>_+xa#GfC!?Tj(^`}x7TGSV(a?%FD zIs8fj#DT@d5GEP12Hn z*8v(83%Zi}i#a$%+byceG>DPW_0X27&H!t5e?Q6Q_5>T)Y{qL~ZeQtQkiWhM_dC0W zO!9U^+~@8Zaf-hi`d)|k+HJ^eVzRlCixqKv%iRNiEO#lU>nda28puBX-|v8o95TL7JcGvnHK*#EtS zGD_8MHKS5XXVr*WJ%)Cv1vTb$xp9<8Oil9(121$`^+$tX{3570-=dno1hgo2BKYrz{B$x`UvcDBnK~Yh@y>8jbWRlEGIJVs)`BWJsr8tp8&z zp4PAxT0Wfnsg}t%T4$=%C^T{F7VV-0U0t$I1VP|gjtd-j=GjZz4XnlG^~Dcw-s(X2 zRxo=!9w~q_knp>b<K%jn-4G*{%EHY`m_Mp5l0Gq;uz%gax z%Rn}lp1cGDumQ&Gn+FA5BLTf?~+7D~OxQcl^xu7KW|}iexq2YYA~!;v`rgh(2lZnt~V=tPth((BRWrvFjw-yrg4v)yjBnkPKQ(r`4BuK&i& z>#fsvm&bc5eHiuz*H?)6q<+?Iv`;w1!x19C?M<;Ft;SiaS#Qy)CwD_c{JAI1uo7&V z(XcOK$rst>%Zb>#nfH5$Vz9L&g=91ow?ZiEy}^JX;#L}tClXrxg}U1ND_Es1BFLAycQ9yrVQ>q(2U-v1~K0#CM1Y1?N#?2lIc zj3!;W8ep|g8)p#&NaZHtxHs`l-D#e-sQ8OPdeZIC6cBGOMXX<^-EMYhLi%^p+31!M z6(pOC9`mg3uTD@(>zmwx@8Ir zS$PDeT00iL|C4u*3T(Ja?%+~`^#Z6W&dHa7EH^D|2LlZNb*e8BMNK!MP<7Go-nxjw zTMps|n2^ba%S1=_hKzqJWGmBpDoTH6t1<)yjpP8uTCb6Hfyy@XP9Cne&I;!5@yx)S znjtS;1V0xT+WC2WKjuY=YXD%^G{cgyYtUiP0dnt!mK`XuvYuiU;)^3U8_%{a2l5QK zW4~)>LW#Qr>M3(`sW-sUwQm7^utQ$B(2*4wS1O-nsH}h!6fAG<<7((3${1DMoudu< z21FTxMTL)|o68GQP)HE#G@tu9$ng|dJ0{Xx6@gez7X?+@(Je=Z-;()hyBxDs3?MtC zA=4x{rfYBR=~Z0q{^;~w{YZHKn{b4HarE#OB`r<%40tXa9UVUiRR`cqkc3!Tz!JcL zg@DB&(anwZ2==N4^SqBJK4b$qE|<84Wf>HC8(cl32tf`5oO8JV_GQDscS9~|YyB%w zDdLon2~QN19mun>AKVGdXMf0Iy}ts=qX51_9Kq?3$g)oYxU!G4zAeQC2MzL%=@~{o zMs!?7VTNn!O6~-sH~?Kd=rzfHi&66lux*l%>ujtyh&r1 zfi>&SOrc1!3PDJtW!yLSWRI@qzY&}Z_u}UK9Jf;53ivm_bMkPUz@uLRk$^ndEv@AY zM><#nRbK)6e>@Ey((trfqj*7sGzo$w^ydDR`K4tn!<06Tx|Cl$Q#s40r{y=HyVVL_|8 zP(>9qqZ2v)Krf|%oL7)WY5AnA*~*n4iH{CHqokiAWtb_0-t;9Z4SFj^hN~T|+rmIa zw7R*ZxfTigFXZnRfcI=Q02A%=^s4QE4Zpdb`}X|_&P%0vN&}f*`VvRor;FmDrx#UeP&|2{Aoo}iWVd#`}^ z=B1MF-C;Zh>O|2M`hV}SmFjD$2DfhJMaUjrYM!AWCC`6tIh=1{{PRamNCW-5msh+W zYJrxP&ifXHMNo=zZYMJ_k`pvEQv*NbLoxd(m>wdZ;n5xPNp>He6e6DlLr=+GYBX9>(|_o0j#-J|>TbUdYG9a6pCJVa?Mmt7r+2J6Ik}t;fRgR8e|hfQn3F-UJ&Y zo;INaBf8MHnqhRjtH#e!wd+XQ`Tih%bP*Z6~U4MP`uA_-zrOJ3kGS?k6jKZdd7 z`k#=}UnxqRkS<3<>8qUO=zMi_EtJjg^jVN`5E%R!s_h=@5KU=T2;q3g7eYq4G$CbX zjY7g0Q=^~M4x8Z5*I;Dm74+6hfGo|CF+`UkOV7;_c`R2Hx|x~CJq0~W9)8n0+^Z7Z zPU+b`|Ne_czIpp-!+6Z2;S0bySfR>LF*(mifl7Aj*1xv>nY0S$3an5Rt1z#?3ik?( z+SLC7m6A8HD(Tt*Gs=~6kfbjT4zJFG;m6unT%ENX`icZXBP2S0xTeaKo zUtV|5>pA8=f*L$~w5~^OiU!?DRdcBHLfm>i zw#eBvI_g^ect&;*Y?30_h}&G4%ebXS@WPe7RWS8La@)jQ&`@R&9F|k|LS+?#F{&+# zwEuhNUSqK4)`gFh=b#M(r2{IViQ^6OY{VtcAjB;(y(n*^RdDc+E6dx2JGa<3h+{Lu zleT+nGmi@np{gjCAug-2``=l*n(duM_9M74#yK|5<(W_FV$QBbCXCE|2=;N z<2j}}o;GP~t)6#>Kr7eqWq`D`>M#_x33mh-Al0h(zu((sNz!DOq(^LHXVkXu!`t^h z@7wMYfBPdHrma?MoFm~cRJ_f+FwQ@k!_+R4Z1hn^X@-2SK*4JsM2!oS#a{HW=f#7u zH$Xjfg(BxVMdD{KL$6!p%a6P~7tX^}%=}?^g@kaFMrefMA{V4&92ee2gj(N9a5}z- zLSOKcI4^{r`u1Ek-4n&KRYMov2<^_Z{bxJv*9@#=DWanQro)mdXHpMjUFMVT6zNzp zbQ=J>6mSz^fCZ@+cYOkoRf}f>$R$HFEycDKdB%=;P+ynciTV-2 zfF<){OR2PALtZQb6kW33n+|z?r@JV>;c4f9f#`vsgvvdJdP&h8i-`9+^Uo@p3o_X? zk55I55;YI#>&LoriX;7EZ*OOh87<9~l|!-La{%=#lWc(4jzQMg=E>h#s(#Fi762?o z?n{c>;U>)l(#2HPLw0x(okDgoXB>#CnLR_s?!4eL(i8dVIYqp{>l|<}Wn^ZS>+tBq zWr_V>2r|fe=bDH`yNeYCASJA27$Jf{V7pqtMaJ3c@4t9GX3r^GMVb&9L6n z#9|XM>5Ls7m$*CXhGX|llQu}U!^R;N^Eg%Y6Vl^4d_sYCn#>#xPzrk4M|qs8I-N;f zeqw6SuQ7s0s;u;sve|blUKe_f$iN|oMi6q;4Zei zeZY2r_D3=^*bxE5**Px8JvNONnc>qU?y?=k=~0o{<*L#RQ?%_!!^Mia1o|c$o<)#h+V5>w zHf9rw0T4CyNaRh45`tUYiDvUAMG5Nb>KSiVl!z0}m9*K-D9aj0v{Xo6-rS%D*<^RZ zY;z?-6D8qGnHvrb!h^SjUve3h4=FZM=gjVk?Q zgip<{*W)vs$_q89`sRARsP4;g>=$7Y3rULNt$I_pYki;c_;e*TERR7) zG5at}M%2k>hOcflR|Pb%0*YfDX@W04m=th%fE-;znx|edY{&vIkX>UoX|^|^1G;Qh z;7w5zB~ZMBV%Sv6YLVfE=O{`p8iof#gReT*;R6uiWtn#^JWNt-A^zQmPi(Ik&X}bo zcj-@^79864v-YY!%{!El-mb<0`m&lwY;HrWprJD{`s`w3R<>G)Klk7FcxKProTGx? zzf0vdVyj`hB}$gfw!!~eb@>!u9wYFVF1ZoeMfqAGxu%A1MuKrHXPcd7D9_=?l5?Q5 zVoxC7k5Dm80{R0ePA5(AR@w?pzS_kRMy8O5vL@xHO)%>w*8gf$S|4b@&COt4Wje|f-z-bFj8 z*7{)$VSYjMrN}(LaFXVSoneuz7G`pc`Ch8}j-$#stJl^UCuQ+<$p#b~9Ld*p9OM!IhUmQb>2jQ2j1LaxHgf*M~zv0 zbf+{jbMgLb|L0G|d*^UNGm(;qH{-J$hWYg1t&sz^Jx3|&%v^r_94^eZxDT%#s0S zZL;c0o?b?Y$6_mkv(jo@tzbBZE$EqA5#I6LGCMi28IXvh^v6``g3I^b)$YvW45g9h zqs@71*qFKMRbkUtj+3{AO%*LhVg86RiN@D3b;;)xsyo-}69@C>nj24)pA>iq-#&gN zTqR+!cnG?Ihuwcr!fW4Nw(ti#rvLL|3m(gp7`$?ZVLm$$z~Krcgt2hxT_u^2Tnfby z3C6|W$S(xZRNGI5JcPdcN_YT-J$U@-rcvZ=ap^oZ%?;A0!o!IGo~4Y8k^sL@Zf6&5 z@D@*kI%-O-Q-aE0upi_;KH;mfh1`#q=eEvvcNf&rL;9r`;ZJu0<@jD^(|^rYZF8Df6#nk7VA9OS%$SadM%!+;gNTL(f%0OK zO*0HtG)xg3z_gj|{`b9a7(HA~+T9P!Cw-oK&ppq%=jHzXVRgT%)oSZJ6h4MUKMSHH z|7_i_oFdJZpS7e2vm}T=>p`+u2a8Y-AHvvuT!r$tAPe6;yRSr?V*Mpo<8T=!h5Qgi zaquPHzuj76+fUzoolJ`;O@!4nDPn(~W?$>4Z-po+guni-{nsBj?OPBPt7ulQ;p2{1 zSvn2#+>d6B+Hc2s5ftmZL8*BhEOOz!&}`IR-5wNPpJ(avt#HzP-8?zH6Mj3+!aQAP z)6ie%D9E+um3+h1)k;60%b^@I7ELpgyZ`lnZ;q&5Wb{oEa20MAS?X* zF`ou;jD0S$b%+im{N_ZiX@3^wtDu5&nup(`BAhYLNZfwXKwhM) z)xWbq6g+QYp9L&|?gAFjzaR4;Ms-)3+3&xV_sTVe;TV1Q|uSH&-zq#6h-XPKGFOv%FFj zRAHSYa7E`LEc`gg3qQ=VG^=*EgPYNwB;|F)GN`X^`3<~&d(?Z~JQCjjAso@z9HA)8 z!g;Wci?=04BYjjo7tz#RqMQ8mr|AsWC)x6Y#k+b(du|&=VU46rlLB|i}C@wzI75ii2iE`KXouKH4dB_EwJ5XkbkXjjBe777Jc48Z8nW( ztc&qG$HA|9D4qgQGEeK(lQ3N7`Lj{1S}vkxI3q*mfN2&%Rv2XPP$UVGbPGM~0<5_F zF`1S@s=suQbzVy+4WUTMOl#wr_JNL?Fu}`SJP>X%$c3J)xfA+Onb!5Z>Cx71MAv!y`m* zi*U4&uZ;{~2BU+aj?gARRoh1B8CZPbSyc;~;Q}uZ_{q~SDuJasKC8V8A|cpnXBUPwU?t(*0t%l%|I`C!}^&DHovOo+Rbu_`SSXte|Fc55M1g6UTKDMfpMVIGRY;k-oVu1fYudG za|z!34NfQtNbk%28wk@OGO}S=5ZrTA8&t;j&|y`FzwOHF>!xzKhx3e*6*;VWzP?+J>r=Qs`CLPoC zgmJ05M|N%uh1}s8$IJ45&#LNtmsS1QIp9!H`RcXil4c3r#3bIhX|a$Tcw>u@&{<64 zo<>>dEM{>fQWm<4+3gk%UB-6(zI|!A9G3}6#sbG>Tot}%aJCV~^xS=$#?FYNl2CL? zK#7Dxna!zh}eB6)*$4f@a1DoR~BVAIW&{K^#I-zGmUm0nuqdnd# zCaz>QdLY@C2dJB~5wuOB!G!L?9cUAdPDYxOAx9@B(RiRcp-x89olqwuJ%g8XjI>pU zqmz-EG2!TBq~rBDI`R1Q$FfCpq|ya2D=P|Rp;9!_eRQ3&&dXOu?%!$lKT>jg99fFt zqJ%}kEmIaS%7sR!X_L2WBI|JMF-{)Iw5-G`=h$RIas0s29r#{goW&joRmL#K>KHyg z7}x4+Bk&Aj%ux2|qk^NFbj=P2cLtgb=Rf0gt&g%BUpXgKx=CIcZ4NaaYPt&F1En%~ zth%PDo8+l0opV-{yEzdvOtta|eWI>a1v~{eoXb>lymhbLzH?JPM|PT6x!WOqqcZ&% zk0&R-;vOs;1*uehL%lL+28hjWb-=JC8f}MCyCrtJm6JBhJeL%2S8Vorl_~yoo=Vc7 z*_FC&vDezW&eBMqkj{JE<{NRZZ{_>uyw{dG?M`*PvUSSHHc88uq)w;ZmZ-sh0JT|d zZ`(Ey{=Q#f6anG_9nf{fzHGx_J1XYEiB`V=>nDPePBs^cbVw>rI_$rfr0m2IDTz|s z0EtbB_dIvUzID(Q4m?Aj=p~YEAX$_z*n-Tfsi6DT^pE|=`3F2{l zVL!BOJxS_l@BnG4Tx&J5yfgmfdpo@iwh>c+)>5jMumOP0&AoaM1utl^1fc66RSU{aFNcL!Xhis?0DW_-)ZYUWyl1%@_N(p3kSQD}jQIgNz z1rLPu!Ims3^Be>Wj?X$GB|31jL^_H(qE7e;!9^toX>+W3#ZV!)W3S5PZ&aX(ke zGYBKY+PA6F&K3ONdZcA9)qx1p>CtS+LD{K}CP0?d2D$mvi>=kue>EI6+4gOaZLBPg zW>qlVpRMQe>T8-fsFkwSXi;}17acY z}d(kiHFSk9f&?3=I4={<;QerKoRMaU9l6CEfJ z10is!c*=`{xSe7cK)S<1diu<;=#cFy=)fp+rxS*yy;0lMwyh6{p`Lzhv85I1RF~`~ zeHz#kMwqW{V~i9jfR|y}&!=N6im8>=o4_{ zpGm9EGW4`*WZ}VF1^KjpiEQ_h+I1W~eGCmjChz=V<%5vG+#`{rVwm5m<8_y0JIK55 zbkosD=Uwculx^ittL&_4PAIgjsTYhC!@&G#3=T~V!SkWw)pQY0U-g02JyGUSQ8$4d ziPDQ^TIyfkd+@3@&3qALOW5-vZnjyj;-&dmMmOuBoZpnu&!V@3Ygr%Zp|T1n9nNf| zgEoXKo!%a!BfO4!K@NiWuV!1TaUH7Q_h2fJG`C_-LK(c;&J7DZsM?KCXqkArY4!A4 z)hm6*DAf7ovHxzV0lo}tLiDJik88%3=?)6)EkE|nsZI3VZ#>0 zF@u~i7+)R}!_DUU^3CX{*T4E-Pgbkg{MYSW(*$$-sNes5dS81TPydQ$Ydzt8!-V&ozvF6yB?UZ9b zzWd(RgvM#w-b5WvyY{cde(m>pfBJFy-4EGa)@rqKMbOVgzmu49b#s1~g<8n;#{ZC! zNR#*qvz#b|74om%EE5j6CX!=zbAtIe$76CrCWH+hGUDB1N!G6`Mnaw6DxZ;*aP3Vn zW%!oC^7${xd8Db}DACynXBpvfxAp3}UT^oh^Ucm)2fh6sb&dz;H;00AGF#pm_EAg{ zoHKoZI+7@n%ZPM(L)3IO3wV6Jvk!1ulxx&ZMZ7T;uR%q5U-Y)L zPpfx;ZiQgzuYc-2o-!48H|}m!cr~UH76|zOIIxuX;qL@9NSzX#^6$R`G5giSd7K01 zSSCkiaks#DCzPJW9L;=~38}${`+JY?nx;hL)1hy7doK!HDYkL&mI5Zmlsn7@Xd2Rh zEk-h|)V+{#O`6)!vir@aDJV5KYLe2xdvg(9n(YgyWctE+w@?Rgv^l_InkJDc zRSLw_9AUu(03Zl0KelZC0E9q$zruhi8a;=q7~sI1IB=Hn3?w`d%N2RGh-XZ+OS)cV zit1Ic^iO)$}!ub^3BpsuX7?>kBr@dHMmM7KLs-@COzK%R+%&J$H!i9;vbp)j)V6> z_*3zAdUoL-c>`}){Q$vlx1`O*VO8IjHxjSyji>qOJvU~N;F|K>NpE+UYTGMC6REcD zFR5p?_w8N8b%U^6{zpzX|2477Xh4#3((OE14ldg3y;+t_RO)V}+OiopB3kk610)e#5yu=)ZfZ+6S%!D2XBuV|LIQjBIB2Y+jIo2COkQu?@^9%70H)wGC$7 zWt)>^9>BQ2s_y>k+C6{$`(bzZbp6{L{Z;G+{)4|dhLMOC&U(Gt)oZKW?+^d_HxF9{ zUJx!K5!Y)6#|?|YYvG+;zg~lnb#TsLb4cN@>qX;R5yR?=5IZMXTvP~ieK)S(teS-_ zaD#H2Umj|kEqpAuIZ>9QRp7_M2cGEXmxs?a`q<*fvU~+N?Nx_d#OK;ZC7qMq2PaXl zeZYd>73)=s_~J~a3WIY5a%z^g4 zN_s;ecu}$8H=Yv}6R`1)(a!ZtTozNIyQ+XG_8!+SF^B6%B8+d%p@Kyas+e4gbiKKr zS4xmyykI}55PyD9YI{E@ohWq9#g2bFuEgv`?4-_vwZ)D5rLh!$6emXKREmj3xOd{X zq)r|qfr0KEy|_wQjl8!7DlG+-r$0pbPyy1yQiiRLi{cOgX68=tC}U)YOvYV zYxv+UkFkg<2>AEmsmZD;uzcIDB^slsq=$nq*}|RN$X&Xg8-J8Ga?ZyBjBCqtEj&5iJp}pAVISQi5UoP5(vs4MBsYbnIpMaVfPWvJ9I2{+ zY@t-}LNV&vYnuQwS9$A<60|DMSwgpf-8(&D7oS&=Pmmu6;p~J1@w8bNLyx{Zm{fDX zle?xIS&6OlrLoSn7fiYq?+`L;u?DBw3veoECrakPq;bhIzvPX4@8Npj-z9bNpDwj1 zg(w9^Wd(OHf^4>_K!AU$vTHc$Mref?2rEWHwmVe8K~OH%$30+yB!Tpo;}e&zj8Dtg z9U^2}C0r@8KP7hnbn3%HV3oseBIOgMsU)5q{j&ZiBd5aibKOo=YV1THs=S*&x0m~O zQm_xDh&&)E&-Ds)l9?)^so7_*3={(AbOVF3Oai-t+U5O*QLrMx>atDN0KsCBZV(w*FWy>I3 zL-wtCViThtce}&yI5?oTAdZ7Q{`6qN&=)vO9A2N7nfJ@|eW_1J(Q%(U1uz$3s#^lE zf^5&|*~MWHRh3FrZzqjN-5MCMN)Vpz7lFkDZ z?{nBd?wttM0{(>$c+m&0hmUGsQQeV}nz|E)&IgF^#YyCM&3x;}*S$LuV5} zgnrOFlZxh#`zc%!1^s2d#aKu5dad z$&hSO8I6;o!SVH?8#4m1^+L105r89XqT6;7JZw>znBOIUBW$YwAveOYWzMM8XtSlk zoXyAPl(Gz4A7+;ReGK&vL2Q+PuE!(*$El@{bW5L7oo%z_0#Fc%FNEQ^we*>xC3*_N zd9GPR4qH0_^E#1g*bJ#j3-maG?IbXI9KrTAGJ0&1%s76ZBiK$ozt1sjUtPb?@oUSH z)@L)NESPCA-rfaNre^8rg~8t4O-(@Y=_SYES{JYc!K6uJRRZW8UC221WWNIMOd z-?Y8&G+2tQBt|<8mg6KyI}Mg#`_-OFuk18fj$fzAo>-1ES~!X?N;q~Q>5TtD%WbN- z(-u?HnrH@d!ql*#f+=2+wa0E(+1hEi3f(fsQ=F&SZZ?$ZR)e*C*DX6aJ~frCkp?Ht z@f1s0x7BGW<562Yk0&@$qtovyGbt!B4dkuW81$OTCPafOW6ou2X+HLPy;f7LX*~Tt zM*rGgHBuN8rlL;a~WDKW#97jI-i@H-u;u@CxgK$!`i<%|B(7Ylzp@B6E~03 zhi~XH!MhyqZ~gFuv#SC9?C~Lp@OZQ~Z|t?_>T7Rft&nG0&SqhZUTKrFD-~viwu|K_ zf|;r@O9L$&0+~sW+l8U8^zEH@V_uuqXA|UVfL7?EZlV=PSHVnli+bob3umpHthRGC z>f?<;5f>d98C!j`*dl_OODNm1w${=zJS)MGy|%&PD$sJ{s=DajY&c~XVC^7ef>jp) zhxJV^rZ8WlI|8}2u6cVeyKv}>t@Ci_N;*3I8h6>ryU|@&H`kPR_ErU4Iz|IHn=3P< zz^!F@mO+{4Q)P-D7Aw!T41IY=nI|)4j_#f7A;+=UR!uJC6q(Wcyl~8-3Ltx;-=&FLQc+fYH4H>N6z~(X=V+6K^T9->|le@)i zob!AFmO{**m=&xAtx9LPnzg;&Add)u%ey?9zMjrsPe*55=>~&c=x3RBj84gM@OzM) z{tJVhwu_@I*976y-fNR91%k^SK}=N$CVB)g69A&*0W7lM0Yq)N>mn+}j$qDJ7%Fwd zexb~y5ITaH3m8%6fP$JL2luR!IJKDx98hO1Z$JUExKV;jHL8#-+A9T7L)ZxFvV*Zu zE6O-~3&R?sMoXJ3GHXa0oxoI)S}kallL(rkf>O>XC6O}$)e8vpftk(&5CmAbZ6p9LG8hj@bUL)&(H9Qo1{7|s!S_%Wb@1(Z8J1S_GW=r_r{b(&C>btJ z(>NV>FDQW}X`IKqIPB|X@W9E1C6-`OkoScmqYI)#TopneGPbB*9EDG0&kuemKBr=g z4Cj9OKnfhPKfPeqjfZ%T$yC!cqW|^!(7|w*^1q(K#7RO^iH_uM#>!V?Xs$KnPwR^2 zk?zswF(5FX{C=f_3GoAt@=Vi<@9JwDD5o&-?v#?JP-Ugk0$U;fMsO(ArHkZa)9O;SOw^AfAw^8y!?y{4wdY}BNO4(!NB3r@gNcu z+S^*J&KgR=6e<=_ZAs`EUsJAuMU$IYD;Ue-udnTQUE{Cd`>kj2jh6T=`#Jah?7OB= zM|eVA50-LH?I))1R0cZCj>5WQ3IsR;XrZe+TF2ucRZ?BhnoiO+O-`+GNt2gPfQuKk zimH8G12&~`K6b83>!;8&_$KFBes{yxq;>B854BiXZ=*;Me)q57AyPb26eY8VM#+vw z1hCy33>M%--b1K^+cpXY1kL6c&41r&8hp|m-mIT+_g7z?6kYw>w|EuzieHG=B#p60 zqzCFRvf!_Kl7u9Ug9dL-z5@5R|u;Cqr6g(;Ps*+g?~$3n(X`YK($UR~c- z0FdGE-Op9KsyV&WH4gZ>3gDozW;^nD!ZBYCF!nu~xQ1yI6jxQ-+IZs3T+4i{wsHrf zXu57!TRXInsv|?Q-4RkXSJrig6N2oK`RLk;rD+D>4pkoDCKeBpSZ5C7I)5rNQ$QD4 z=utlkCD+ZRlFXxhoFw>7I)jCUzx*V9|Iyq04#gIJKn$pXK8X6^QaURaE~IiLT@gar z5~x47*`Mq4Pd8FZf(6t>LTHwR(ivU(>20q@Q*PdvtfS=ZB-ic9e*WM!-hF-7;_q4wo&0R>kIrDM_e9UTNPCDNsc(7gGM@MM1U>FL)%j zRketcHKtHfVHN}z<$rE?vHD*uQ86VVOY%R|hb~L;I{t8zstra6ReR`+| z;9C~pCUX`Xc0%7AlVnL05(Me~tFz^9^VU}}r-UlGnTNzhc;KTSJhGsDTzP^@D|)HX zH_B6Ts=}k*7L$-Qv7-;pNmb9-1kHc*9_PtVpZ$0c;AL?t>25cK$$5)O+14pMr(OFx zbmrVxm3<#TIOp0*|M|CAG=$E|(o`>1DaHy_!9nnZz309M5BLf4cjgsK)gSsIx&K7| zeDAPQrDTy1@(wR{NYd(euKj7@IAn=G5B#v`Em6!CPpR_vC|Yxl6dbQ9whakCXAkn4 zKRjqp4OO$)LD03~tgQ>qx?9xlp<0aMT&}Dr=G1UDhxjJiMuCB8jb#T;t7vGrx;AiH zz!c4JG^+*BLc>uT!U5t3^aj}PQ`?tCXle`egJwBMk#*NG zCtcuorsJ67E)uOHy^&}iqm4+T^NOjPmV2km%6&axDk$S(ABH-k4xr5B+Wny=3mhx= z`2Z&b=rEqv?T_Ul1YE9z81h4{4W=arF$T0+K}il*b5%$7h^w(eWNbk=d&(v3_D{b54F z1W;l43eda^`|7QdAI(fb$GSl@HnI1ql%U*QL4N@wzr0HK|s zH#Y>7jC){H|L9zwG>#D9#>hTPrpa{rzjtLrjVv3IOz2JZg020uyWeV8TKwVfWR;w4 z2Z;jC4cD5^&c5dpNp=^7#AvO92ONiUJ~%7KPPPf6jHXniA%(|5MfzVBl6#z_Arn;* zW!YMlR8@mX9A_fQ1YX4HI?z-|K*&f+10J#^CM!zr2Nf$1geD@48OM|bcM+Xe03ln% zgWVeeoG?Bk$2DyWUmAZI7Y(uw0pVqnaCAV}1zEQuLylwF*s|f*c518^@}c!b>h1Jv zrMJjJjwvm7YUQ3eMYivOyjLsFZDZ5I4w_A*q4%{g+Z=p-wjYh~j-80b~Vz5Y~=b{)X5xWYip2 zoU1yvq!6O`?kgn%hx1%LSw0g8*x)*AFCI0Ur+O(K6X{ca{vApWhzd$m7PpUs;nLQL758&1Y#*8UO{hqg=-@R80TT$J-*Ns9{FnZvtSq>VK6ibf9bDst}B#Nb|vN=qkWR!0tQ#*^@S$xxi*^a&fiS6R>UQL%&} zukc>~q12y>|85#Ht(sTsDqbJ*{T=kk8bQY90Hoz6PIVjnmiCrZSpyz;@(MX^BJCW zmDH1s()JX4?Vjm05!bmWnf=G{sUxK%@t?=2!bY#l-%g2TQKayZ6R+CPHq+<-L$$r; zF`{39>PLw-bi!g4tN%vyUZJw6`HF>fnd5bM*KRGsh{|Y{*g0LmKd$zh>b33qH#g?L zZ_bU&w}ZpT;(`Zc=NR(FpG*MPJ%+RVsr)hk(B3hqKNZnHBk{+ENp= z-sXDWX^|^sTF|!c^m}sQMZUE^0o_0%29%)u_MD1IK__qybKutxISlWqf?qq&l}|>d80(K5W+2RPP8p|T z?s5DY#i?O)uqIo@FAEFBT?waJlM$Qc9KL)yUs)vXyS>xoTG2TuZS6;7s1$t|CJAUA zkyBZqHTV1s?Nihpk&#hMOqNftASskaH0961_n>;c`f8Ef1$i;%EFoDT62qh*ahyn@ zjVcloqEK@z!>@y14vz-p-EU-|ozcNvL{i9T!Obxl3=Zzdeo76Eyi_n@8qUky0@CCi zIr398mXf#NIMX**=cp;8T!WvsR=)(DfzD|HpVg&;j4e>_-ri0SnOT-MZ|iBsYbGe{vmi21#beKF%A|3g0>O|$7CgMo%{h@8oBRQbD*&{Av()%0{N->`F?5%J8l2l2Pd~Rj>OdBV0Gm z7D9Iwahjf5F7Mcw{wyeG8H3bf>eHXviegTA0lf;rv&dFDJ34_++=gZUd+FFcJL86y zOL+9B!`Fj|7>Tz(AHHdfnU@}m4-c<6wAArW1$-`9T8VaNkmK0M<-FWPbN^;-=Wwe5 zXV@+C&C|8aG7aYA0$<-c++Th>@ILpu9sBBsTBJuC>1Y-Ft+BH4(2dZIMm%PcdnVGb zmI?1jB0%QOZ;uWBnJ5&#G+i!g#aBE0qeZpirE9H7#Ttlj@DTQint+9=#mw8~Db=Ut zu<#^seR_RW$4PA+MTIL|PxjSvu_WjNi1hhQwziILt+1QLwcJwM=v6013y-=5*M!-K zcBHd8d)=0{^5jwNTRC~AWUD>Q!{24AswDLJYqOZSJT7KD=8~qd-LAs2ru4GR8ec&Fc5zCuMovh5B9K)J&bl` zgy3{5nPcKmHpURLd~q~n$w+cZSN7j`Q4+^Voiu~_@w@N4`|fn-kDuyA9Ryr5YsvkG zI~zO&K~Oij6r6CatV5LE$J6Y~Bq2BC^748=IvNjdX);M-48HA)jV9A!Ob65H;5$;@ z^-MRfm$0!u>fnzg`=?KP`eES3juPhVzpgp zM{}ujgjFNuEAsT`h)E0Xt1cP|W6cUM5oc1aypT|Opd&r4Pqe9+6m~C%YQdNCz!G@l zAah2jG72p>qITGhC_p(e7hwDYBQlq)T=lzJh^wpii810t1yqVkI1Il*pn^)9#~su) zacF?+suuD^1N(g(>%xmWN&b)Lp4rb(K3-9y&?|QAzK8Ou`{{lB!2=jp!o;s`CVoQ{ zvNc3E>ueD`Ua|z2f+}#H@pe(8mi=u05|}woKODJr%ys1kN?{$CczZO_?tc8$;b^%o zpuMgFYAgnd3$PetjnfpAU)vipXVN}z?64;G*Os&UR*xvS0fy_bIZ?D&SkfZ?ueg!*Ji(nE;a(>=f}O<^Y@!ax*-_xTlTLX zmqq)arJEKP1-sKyrpbv8oy-h#CyIUi_fFIzrUs-W%X{bKd~;56d1DtgilUN1kMMU+ zNX@gSg`IfgirGD^Ln=J7QPYtJ?cuagv$4?gQp_>N66$$vak~-@qp0!eOpi;FX?$^Z z9@Et|#gj#0>{l)nBYqiBhFp}&4=HwFQ@RwpUH>J@OPzXYG;yVQH5NLN+Ee!(>jANM zQqQSdm<$8j%q?6YnS+FP6P6$7)93fUP`3_;l-pS&ql3tjlVdm@KzMBculBo3m^^3r z<{NdU`&JW{I>nHB!KwF`FI9%o9$FtV`D_DE@Z~j0E~IhP~XLC#QYSY46+FEITV!L?&@c z>a{m_*u?-s>_2w~9;{tBmyJ6cGI~NTL~d77S0$A90+1`28!IzL0Bwu4tW3`vf`LS? z?WI6xj79(=Nww_7dM<)}iTHgVdqadD!E3?ld-r|$d;B12C76|-!b&~zZU@Dhh&1Fe zO&vkAZyZDs-hHVzo6YlpO~ss~Ja61O@02Fa&#z5Q68eS7BIcU-N#kf=RMm(i)vGEl zS#Xj@$1O#hB*8S-tT^R+(xEXWd~-US^MH%IF7fsuZxCjberQ$NFrm3%q+FfTP*ux? zjM0oRzATXp79(6RHTCjB>j2_VKUTn4uq-JT&$EQA>65#~NO1{H9FE-9f(o7?f5Rl} zo}~?@TVSw_?WnY0OIMEUSfmw`Rkg~|n#BKPyETvHbLfQfQNki8Z1cRBhP;f&n}If7 zjX%wi!Ait15Qgvb6hkd;TdIqQmsMF2Po4zv)bu}-Yjm&d6I&uIR}_l6#L@4@c4CG zcoLzvGt3@hOq{k)MzHLP5@Q;ZXtElEvXbJ;+3{&sE@3rT$*Q+ValOc$U?y*C%maI6 z+ZyM>d+~~gdHfG}iFVMs#JBeZ&cE?IIV~h518xqsK-VKfmN(dmfV=Xj#zgLuN3|o7 z|3D5-D^3Fb+#E5QYh@Himq#ai!#P@gD(Fv|bsVkbMTiA%7X=^1TWxdO zHWL2sU%}C-V`av56Fa@$$k*POFGF;CX;435D7`BA(97@wtSiV_gjFk06~zp z)2Tk#GWlS!*j?-!;J^PP*ab(~Cl0aoFC1MmM7;2~#V%MyKHL8`!U4k$im-c;0v(FN z(7N`$tv{p$d(qLCqaa>W;#iLFg^~4syj)G^GwWyT`26&6d?CLbjVFWKs~h{*`RWEB z9qK!X?))(7)BqRrB?q4U^!m+D3S_yk7t87OVEK_#3K-cV_NdY+K=6A!884UPQ3<|a zc!L?ku4de7Je4wR?JhnOarjR(tdA`1^AhJ_@KGFTUI9(F+f0N5ZJ z;+#S^j8GJZ@Z5_jg~!Z~5@a{T>>e}Sn*g(rgb}DMfBUUIDO;P^b0XqLyuP14>$q7vQM3K{T=J)Uo4=7Kc84#mk}Ulr?6Mn zm#+=1IMfeuFOwxak;hcv39cuh{_?5V3q6JdiX6NLIrgp2cVbU`_x&#}^Ml^2&a2NA zlKjo+ve$Lj649#6wm9M_5AAUYnc}#{%Wwb>^EHJ%BWb|?3bK|^8q5+SH!)Z2Ik=JJ z2Sy?cJUEznJ&h)+gYF2W!PLkC2pC3I*x+bjxIxW5)~F=3gQ_0lqOQ) z!aU*ID0^U5eKMSDO3{E0stT*iq`zU>2yL?s+A!|}iJaYvqI+yokZni)Dq_UjCa4MW z_WNLhEAl@sGYDG|i2w9hv-<$W;VDuvQVqDGhg#754n0ahSuzVQPXzmxiIr|(rP$g) zU@iN>WEZ?SNq(PotjHI*+B5p2cYr)#LtO3#z`%pgT=91!rzYD*p8LnH1nhqC?9~*Rl9~+MMuZwR z`fX+dqsx9Dyl6CL3?iJ_2FkcrgyHdh8^UE=E5eX=;#Mq6z*eNe+c~%mX$e@wwo*(Q zU8WI8%Aps_`DA)EoxQW?lL@Hw^~I41w7Qyq0Mr{ZO4KiBZIa_G8-FMf)xD0$9{Vv* zyWhNq&qWoZ&z!mafz9d@!rH{3p0r3XE6I&6z!gc<4B%m}OFW0hE?zx?68FX1Fe^=( zlErt7xRX_{3zo7W2fq6@VW%O=E||X|6xMZx?=gK|Ox8MInQoWzUnc5FZf~LrMFBV; zu{`1KY$!WC?AkC7&SeCuTqEZ$4s4&1E%6YQ-#3RdHNUOuvN;ICY`mB>Z1}tF{B?JRM?2iF3TE92}6VTG1bm(%SSsX)sLyqIG&9l5*ATS>CTk^-^&Q7xU0>jJPzufrHo#vZ?q9H zO$Dr^uzy}$Y#kPj=Ca)~yydo%>M0-rhLD0wjja4@_HGVYFM`Zg*S2b!CvBV5&!+B7 zjg9h9-qb^>52W?x*A!l!wq3s6W@!xLD&QVb;tB^4I>@uR*E0tQ^G78QAr3PzHKgly zem3v&HHw_wG$D}r^cG}V@f8Pd$&wxJOc*Jsd-%a$|Nh*`OcOJ__wOqc3(C#YRl)!% z;?;j+%pPSr8-l6Zf(%so5o8OXraSzYkIo2IyLnnZ2A+HEyJYhyF_cqF1fG(sawt75 z*5BMokp`BDo3laeg)w^u8x>7MI-SiZD41MF zfyGU2bb*>CeXRP~9Y6NK$O;`9_fo|v@+M^q4`9k*GdI%Us_T>0qGO^SPDH*CLK=Nl z;c6#hejM~B0XHsre16DA1c7|znruhJPK)dVDvoVJYZ@hySnesL ztLTPVJS)!Ks+?!wqP9O*YWv30KCd3Uu;OT%Jy#`Fct9i?LCAs(5WeZkJaxzpg)@AJ z%%v?)98}N?505C>6P|L#dt;G+7*{_}DugQZRjVdlm{0^pw}GE0{5-UkC|;71S7_al zpt3p*teiG!SE!DN5TR&Ifj9oG&9caT@3V*tk&=5n@uBV#N3o3qQ?u@M_hz?s4;uUzO@uG(W0gqZCc19vI#RIXFKUZDAfySAU}cRkUxm zpnCDap0Y|J>}waRrI9#+zP0v!ss$t}?x+4!htR|i6TIrI(^FQX&(2clCoC=VfNRFvUynp5FV(%`@9u}9aL}Q;fT&k~B*s@-n^zR9+V+1wLo zNj=om=!NA?QpOuf^U5tC74yI~TF9Z=b+0AhU9{FmwQS8gTh+Y1MIHH)jJjIpPhG_fiL0JP7#EqtE7_@D#Y9~7fu{FxHuc`G4oXGCK7bNLy8NELQM z>?q8{#iJ%>0Ld@KoFs$zSHsSV#Pr;9de7zml6brUrMs!~Zaf<=r$f%eL3>MQayv`j zYH#OUe!LmmgXMDYQDDw=nA_XwNW49-duuNz!?$nF&IIbM4s|{HQM~+7_i}i1t)n=g;+7Bixtj5MacF2kN*~k41=My3 zE5gb`M|PV`ZEECcU1O3!JV)|JEz<-TmV1Mz#h$4bou4UeiL|&~+9YStPoDa(Z~vUB zul%j%0@Z9j8yA<6w&kkk#bQ3M<6~Mk4@AoM z<7FMe!E%*yp@hk&UZz%qJk%OPL@B>G+jHOxuY0X7^|y8g(Vr}9=+s^JHRKo7o5#i( zu6;M=-LJj)-74kT=A$(B#s5u26DON!>dsW^nb!XwN9hZyH@bJ@Y@VwR{O6^b^2LQ2it>Aw#X$l6|xC`6^dUoii=~O(C1<3OL!$c zLflzOg>6CNTQye+7NzYgpvUH ziR2+a#-M&B0cH!_s?lmQFP&!EuiTngOm@2a?XE0CeY6RWCbA{;$;)-W*Ruzm=kBfj z_%wXz+<)#$Lu+geN0y}ZZ<0W3H0X4#nK2Xo&^#Y4;$$ItoKgK3GIS{WWavM^DsPMF zD9l{~kjirrM{;=^Me4NxCGRYGXI55&QRLbhMU^sZz)YAkB~+TSeC=scg&oytn|Ud* zV>{K3HOyGZYD`XP$%-9R&`L1>($Hg9@Sa0MDZ39k~xTez?;;Qsj5cG3nTFHTblVJ9}ANgyMc*&vqM~2azbBx9snzLaS^;ywijU@BnzP1Ki$F-Gd-tfKy!6$=P%;!y+q&;xF z9L=C|tGD-}oTO|Gm#ck9#n`2sQ#T0Nc4ZHHI2>Cr8SEvrMCl_pqO$gjm-z{Q0<~04 zPvbBYyysU~AyQnaLWmP$=~lZp5C^2?)>hGL@|qZ2+ww=*3i$8qd{t?aAS9NYoaelm zd7g1@=BiLZ5IBS64()FZOqk_Eq5fE@x64~$Q48S9dl0#U9Pe?5{Bf`F*9&O;G1m9s z%FX&YTa<6BVBekMXcO$+AA`Fl?ujegN6*^g+j9HRjCt6QuJLIEOVyuiUTJkUmezT1rkL zTWI-0X2fcTZB1!ZC^BE&05|BVtNIb~FryO(&OYT3&e>wvTDl0Y&M!hT`$@vep>Q=N z8E(LFd)<`YDs|yxH6o_1dYeC^y_9)u@TiTwOjVyJ$_p3P&`7SIFtv%)NfVU%TwAK< zxZCj6b9|bGZ57Au{~;Q@91Umzrl9qjG(@8zJoGbfJ@`AASeaCubllijY;9gZJ0 z>`=N4or)rc|XpF};8w`jeb++CAzB3$#fdS8e-K5?4lLPbK%sb}Y&hMx0 z-0gHap$~;WVesAqrtNyrZPSqNrOfp^dv-Mdiy0z7!U7A}3F z1>xA2EVzJnAl?Df0%MB-e1w*Rz`TQa%i~V`F)ZNwg5u0fLs}Zp4NS)t;4*;r#22zB zU;ic6zXy|EXdC!d7g$yqvVgD*ehGuQGob@lVo%Y;Sk9aUqLg{>7)ZA7fMrfZZx&+q zaY8H5o&|GWatC2Bn5szVkaIgVv;%WNfvVr?y%VBEWvCK5a<{=9^rn{cg#$1s?y3$^D*0rFBh6wJ?F(({gxA2~_TN&>84c*r4-R!=5@oHB% z`9s*90?UWHpAUoyoPy8_j)dK@<5;`<zw+nFqO%!Bf3+9%aLEN2rpwrNLfVc0@8zwXB{5d&w<~ao7M!~ zjXdKRp=U72L$Bj+P9i3DcvE1&GAmbN;J)J&VvZYtJ(-HIHWA-UdYPXYQ-zs3USoE(9flj9<9ZA zeofi3PG3hJK-SBTFD0L*A_-HJbm2@OI)M+Z>CsV+{5CkJ7MS^%e_Wbhwt9?!iGk(5 zEQvo@m`ljBUCwdwf;Mzq=qj8cLpsNxh~qpa7=dcxIMw()Mwx!IL(8HF*1|y4%g9HK zY}?s2Bn(vpd}BB>?HCUI*?_&swzUDrX8xj;)y5dk*O@zBj^wfNGo%GHR`MjzDnm12 z@L_NXma)pWuxtqmWQcw_Y;@^XhluapwFn0H7rJ*5 zp5N3a(R)+RSs<=sc_7B0B4nmLL-9{^!V@fxmgeEK!6o<~x|5Z9fH9H*FajYKK}A$u z)SXH#U7@QF@Y5KEFU#0Oh`=a9Hi>QB-?L~uEkrMhb>$+M@<66+sZMk?snUZbIHy%S z$k-P1Y6!3lODw7YXSUbn40ls}tYurRE|JTUg_)<)AiTv^d#$r#q2EWyTDWLuIz_%d zxgf`dDu-e&%(BF)jMkdGscCv&cW#{Fw83Iw0;A~ULGz?XVimuqx)Dhfi_IB2zL};6 z1aL!Jp4RbUiFCi=GGWMPzn-|3K(EAv!s_%m;!N1zq@iaw7^Q2Sw3G18t(OK`AVnP?jdA$Pdh)SQqj+s{a8h(lVMe&DA_NZn(LJCU`9 zSPuX;!CWUWu$|7S5WR3+(XhY1EAzo6MK|4Q8U1TG^Bz#Zd9k#+tg!~;tATDGUA zjfDOPOh-i}Fm*69xMZ3VAYyH7$S-kNE@>5wOdPI9D=IRI^c}5_s!Bse>`GbUKz3P& zij0$r*OYfzdV=;O-pKtAlA0X}AGy}89mZ}g4khV5uXKYQ54sjGBDb6C)o!Qg5Fd!* zYF!ZEv9yi#dm~P5q|@65iR-~xuTjgms{F>(+(C>eNA)}(ral(lrJb}IwXQ0XmZoHE zDUo5JB(h$#jE|{qld2Y#6)coz7&f5b)fPI5R_Ugie9AWUwC%a4CmY46L)#hXB2}VN zpGF=mhbNVjQb>CUfBODJxZgSFcL&6iG=|sPg#*e*KnpAZsK21TuxrxY`D%K_*NxrVY*4OK)30jT(f$4@ZnH$EIHOd(k{m{=soWN)j_Q}57yE)W=VVz(j0n|p zXEh7N?YgHX#ql#aZO0EVFyr9LZ!cbB{Y~dq+!&fVyTlwcAOu6;Ap_CE=OFl&&N!;O zb{a*Hk{x*WjpMFF00cN$w!z8uVEi{U0@}|A#MumaToAwmvg4&e&qSu+pSbC@>VHwv zS8a5r57og?SLDiBT~SrVYaO`_yfByLuC@9sLUAJEzD3nyifH00@`-Ts8OxYaPon{= z4TVCR-m+2&QxDlq=E0s3g_UO=&bk{>&TrF{pmqYdnk(&hFZX5GPk>u9Oqy781UCCp z+tw+Y7j_cj#!h=S^6#HiZ@19YVy-oI9rvErPvUMTvG2=K7T|Jt4^ zC9xoZOJk0InHw2tCP}h{dbGg-Cfh3K!>4wNMMPq)xEmja7T)LMds@x1IDg6<;IE7B zpCWti$o@bGoapNzp&okr%MIKTdkW8=!tpwKV;;+#o@0O z<5@{tB$<3kfAPKj>F(EAVVTy1mPHWL1>U%_!bwVctpv6D23eYu_@(Xnd1_$1}hOp?(+ zA}Fz@NR|X;DRuw*VM&VO3n&4Eoa83;hm0Zui^XE`?1NoU|NO<7Ih9Jq_ptISCa+y& zSl-8*nKK}^JO9|kj*BOVVC|x)Ny{SGwUGI-jjXAUrnrq4*c`4LT)#su-raBg&4Bo0 zPc`uzTco}~hKa@|NB1FZj)<|qFyuug{F|7_^OS*OUK%EDS-Pzlb0-u{zb39>O+k9) zlQk4I)BQIKE>n)ky-WlTnPmWcD{@TWeVVupe_lv zJo+ED2tFaNkr%2VWkJu^bz`Z#QY_yz%UT4?S!fY10oa{;(A%)cy^c)klwtx}maSnK z0R!W+RR7+cgRURzqHvo3n0EYN_P2=3;sJc8#rXUw@Nb-PHnz{!-x+kRi| z4o96{Qyq2cgKLTdXHOqruv^s!qnrBhs$1`R!t?u<87>5dC%K?2OIcLwZ>U7n2qgd;1 zb42?v+YPQ;H=|~62xC2c{4)FaZMXGXpfEgtar!cAzTWUk?Wb4b#m~>rE@C&^h7@vP zIfe?psLb|K-9%G}BYA&3KhG@JJ*y4FeVFZHGgprHfKTjAE`pd55Q!gX6Ht_h8jLyL zXJvD7Tv(3ilvRTF1ifj~t$CrU?%H#@{?AUH9Mu$J(~r+jo~FD3cvy{B4tN;t3>t?5 zDtXY0P_IvqP_9R(P#lUGz?g{0v4DI?{tkCqaxZas$P9UnnPFr~JIiakN2WdvZ?F5b=S}9Dt(7laK&6CtC zX|$sn=l13@+R=fuw4}{;6Xn1eX}@TP9b&pcUnw_N6qkGLN?}cf)B2S7H@roI0+nl< z-;t*Z{JKHz4*C26|_!mWR-SoX#8R#e2G>dC` zLN*DqWfEjBOqa>f#k(2xH*k-Es$P!<>adbMM{~u(iA=#ucPKR^GuKa^;eUGcsPbvVIUjQm2vN@`k18usSEM1nxQOrY}s}^K# z^D=%sIXO98AU8-GgfSW15$465R^dR9#8|rrE8c_G9Dm|4%$;ix*_xS#2$FH;kQXIN zVx{W#I#gVWk&X)@T>6oEs07}5#^(|#f<&S%+KmaqCSGz71A@Y;fk+}w^5k18z!fGC zdDQNpW!tc*wtV>^w(fH(WKHUGg-DKzDjOYgvk>F|XQ7r1BnS?H43JGG$hMvIc!tfF z_~D!TTq1y_M=Cq^MT=G@HGR2tYlPbs){b$Qe8>`XHY+p4bEh~n6MnnDN^apM=+J=g zt{^G%_~rA{XJ>0&12#aYjwVIb&8L5CvPJAK1IiFjvT0MjSCECpTHEkQGTF4rF~teL zno`j(2IOV*-WFsWMTlfVHVnH?K>+GITkGGbWoRZ)+D4lzjxM{OTqP-j3T)f!d zwIx1Ci(;naoqRYLmS9+$(OKlG( z?4Ye{wRW%SG7w&pDjDFR`=Kj>Nsf|qW#6RZyN@Sji>EH0*bD4ly7s(byRPrRw*{mQ z{^DKWxHh5ZP->9GqRt)gw$PVOYmrl(9bfRSZlnUv&qU@1wHVZN3@g~!39y0xrvQen zQL#njk8G!VIQE_8>IsD?lv?=$w22_2SXzJ$#g8KlC~gq%c9|PYsS8N#CYd`-yY4_0 zY`twtGWS?H??lV*z&nf0QWT(5M!Ing+cn54bSk~0{xh)W}Wu$CsDR|zj59^z&PFt5Gw;}eh9!@lO$t78f$z#S=Optej{ivP42Evn(P(%3J zSMftE@Rwv##l-P%684RdFoAf$xd4Sci6`-u^74#n9)f1=stXh$dIr=lVc~-!02|R$ z^?^j)VBMlVow|5Rhp8#QdbX9RATSqdKcy6?9z&r(_3gTCTpv<1W6=}~y zQCx5w492=?58q4OYjs>q1Iq$m;}u*Mp=*KT_iJN+5W6G4`7MR5EZ2*gN?sfIJE#1m za?0Pr*`P#-;DFrq`^1SEbHCbj#;!mYXGCQs@6ML844Ej%fJUjeXR>X7Prx_MMxo%( zfFB6b(F6lf^u_^#xFShb-_hX85M&oVT zQx6U=$bJ!B1e8&i6YTKO*YYZH)!U;ZLy7W6^s6IM^$pl(CCZi|5iju~ar9nSqxZHu z9CdsBPQ5K`wXgN-7Ghc^4(E2}_iiMvss3LVwD}~Y$$l{e^2-9AzC9Y9Zr>%}L_|w* zeTmSNI0VH~7^ff}@VY{rchPo7IPtp=4}E)qSJKv>C<^&phtAk=Htz(pQZ?C(d#6PK zQdOIydiOo!LgwaiyUnk?8&y!}jXFpDwLFh%_J^gOSzF!yMRUqW@@$oVCy+b2DHgKwTzy0U!638Y&)wd`r z#lW}A6@7UHc+Xl;-Z4s3m-1KKc*#pX@hQS!kYGZQNnj+f^naCBU2oeq6n*cn82YpU zdsv*<-mn1!EzvO-iBw6-U4R0Ds%nW>*UtQbb^m_%Qg&p?m$VxoFra&QNS<>)_}lL< z&o6I|f7P`D3}QKYWOm`|YmYy#4XJ_UrN655IbsP4?C2de>QX z_!L-_?sw&Gv0mBr=X%vy+l^d7Vc@4GDVoT|qo?JneCpl18wpSx1fn>4p#Vv;UVq-d zh}C4jSbplU^kbJ4scD*iEI=b~{#m};*PH)31nt+rQd5_k>iK-}>G$iFXXU1wQ|#k* zw<)XLl~fL3cALfO$$O}?Xh_>~S3Ucf&VrYSvgb`tl{30?NPslk)PF6$`uNVH0V-WT z)n8wHROiu9BJID_n?+cIZpzhgYZ$7~|TGha!@@O_;h8G#vMi^^Vkuqbs27((vhJZ@)D^T{m0@UCV zYNk1|-O;DhJWE8xEN{0Rk&LInX6IXa>kja+`N*@o$)kuH1BjnUE|%L_5h-bf%>9x$ z6xUj5uO2Z^EGs4~p0fmxPJ;MgBJK}T5z$F*9w9oUqe6nW(y`M50;1V`OoydPc?#j5 z>9A(<9wqq26K-yQL+i+GnoXI&-EU|OANXUz`Ja$8=*A7Lq610Ar9})aVw|Xq%K~@f zF~VpyX!)}wzZbHYW1Ca5 zNQFt6jb>Qdv<7pe&~wF zjKMOyrLB=TD&RIk-XFw3EbR~I398S9Rx)jjyrmsFbgx_5m*b6dgH0?&cW!BS&|h(1 zL@b)UE<-f!lVK)Fc{GDEU~?#THgV41(I$b41ODI6}`5Fe-X5v)sl|(+KlSgNDpB8+ztJ#H79F7CQ~1 zJOwk26Ojt5ISTGh<{1#sD|6{!2=a`H$R@{*grm$eEgBSd!BoZQ*O2zW0U-mK#!?-6 zT2`7tg}~@Q2(7&_ZQ~o#!XpF)gJKXlk;lSQ?BPi^q8&Uy@t+T3&NGD4#vP!r zbIx5R2?@Q>ZrUA;nNv8rrmj$ zbN%?5_G8+XYhJx9fu0#ZUh(vWESRd?z4hGN_kZmiYj4{)@_T=U5g3RUC>HJReK;U{ zI5>`+YS)%s%jrI@2Sbr)n_F2_MJbK5=zqT%QnEyede~`ko9qUNO-VDu8FDzB2jw6B z9d5%HkNXRp9pRzllHQ0V?)KK<`1R~%@AWqq z^>DvU%*zZ$PtLGLvnyk<8qXHf;d1q(J+lDel|*QVFEi2wXZ~gm;NP|LG@4E43&Xa} znYFTJmeGl^B9bb8N2Kx4UQT{1a0q|vByeNOg5KKUvHvh)yD%c05Bi=HJKyyF_*?^c zMci7@9QMJdxAi1dxJHU9c<68*Z=(cJJQ5B1xBHmzm%aYlcQ*Kq`0+j@6&e*1Mv#)Y zbNr+VU%-Gtb`n2+M4u^zmM#zAFp<j{DJqvo>pYWJOvbO`mVZ2u>7lt*C5;q?7p^5F%{FG5x zNP^46{XhT%&1Uaky|YwjVA1wbWk0dV!`o*qq;^i=Y*5D%PNI}nkodkz2Je)0rcB96 z;w=m+b)A?D`h_c27N-$)$a7u_Ob8Mg5oKJbQUYZ%#fbJ6m&4KOYBn93)@m{v4JRPU zYh^mCaK@KPDt)~+^05K$)g2yzvANeFaO zk|{Y(;+O`~-E{jHKm=7J` zC&+OtbfdVQ%PRTUKREryg&#L~Rs?fj439hm4R9?ImroZq4MD=)h+5$bCqoeK!s@rpgybe#}f6Yqf zx0P_BVzv?pKn`f=LwD%yV?v_+pfA1v>37b8As_%}Kf0qXL8JEyx`W+siR!k|`tH(xQn`dWq9T6Ul8B6a2O|5^ zJFYB)h=s?9Xt7x7tP^onphi+TF^Zno8VeP}Vv?)8c(NoFd{S41q`S~3Lj6?|hjc+@ z3S_FQJ~LK>cdO=-w8^vstMl~fBYDkO%$aTCuqLHZv}9BC9szcV8P-!QS=uK@GDUL* zao-@#iCAffF0V{4Z{H+h2jc{Gr@$pvvb$BnXZ?`31@ecEIshRDO<*c(gWB=4(Fy_P)^WfVY; zPeHfLmZxk{nbyPbl+%w5RBVX(sN;7hRyTzWX2GXB3U*6;HNo)@Gz8s(&(>WGMhk2@ z^t~5lmh7U5I#?q#y5g$|E+Srn$rSnBAw1heECIg7SG(6Gz$OrQ`zeZOH!%bO<)9o@ zYGAkk;?3Sh_LhO)gr6uoM+|C!bPichKy5eIKEH^j=m*+w<4mm>K%#GWvS_SjM$oD zX)bLnD+fYqJBoj%@iravuK8jJ;XD@jd)%XBtGP4oI>E?6Ya<(tE<6p1PXlu4#F*Vy zF1z4~ehL>&I6LPa=g0Q}n8T`9uhli5uXPdT!CF`SHOrnGBXewuRsO2vj9uHN#zn)L z<6}++h(N4lDf*PBF>di-N%j!W?UWJ3%wMSYa39CRa~IYAboXWKuAF4a9s&QJSU%dr zER(ckaG6lwJ2A1OtubODp{*FAK^$Qr6vszVpz+OQ zay1*R7RG!s92pwL%OGy%wy{`hbT9)jtrXytAVDizR%c8Hq*IlxvOvMv$unSh)hUge z6-|%my0)bG81}OYVHbU>Zf;ndnrEfTW7udVH}rj#VtWBnOKuo`N#-QAFU6aAg8H?R zJAt_xSv~J2pdXVX6--C(P`phEiRx_wp)&p_*#8YtJszZ03nJ z1vZHwNTLsE45V0~H|F)53H&ctZ+M($r-XOF^C&+JkGZBNaJ)kp-UV+b-M?MQ?Q4R@#n}{I3Fr%KeI%RV=gk6C@ z+Z zRRD{(Q{XO1PaLu_I0dk)2#*)VDQ8()t;VSYil(HMM#XR|$HK+gfHc7>bPa-@9KVeE zd%=Ex&CFAEuK^E?24YjfMk7TM-I2(q9>J4bkDhjEm; z9h5zjp(J;Bo=`7x_JUCAGCd!e!7xIg(M^HSa_>^Btqx1J6F!eYsaTI%vyHWjv`|&7 zc0r5+3^&)jMU)L6CA?CJtc-;|2X1~aX5#%5^}0GUR>8%1){|4Gtj*J+$sUW8aqXn2 zYL9`?a~{=-_MyOB8~PP@hG`nQJ-MN&2!TQ66P2PUh75O~oFI?TR0r7IKcI!oS~WxS z_n_!uWtw9`f(=Ga#j6G`l7|Nxh}Z59O(h;lj}bm+Z7iCQg-GB01qA&$%_IEEM1=r7h(BpS8f^ zubhSzXvNNIC4}GK=84^^rubL8hGGa+H z1ZJfolw{9lVpSY@=B!+n(!NYm2I4M@RPO5_YqM$HDvgJVn5N>`Fbt-5_`Rw8X6qq_ zW8b03Gb4n%L|8QO)>OrTlSUkS5{B>@uhBwO@{??R}#O&-s17I%~ z@_m*wE<8>xkaaV?6mQO)1>!{}EfBt9BYy1)2B{1%om~NdF&^Gbmc?Jh(t%A)3qfGT z=^qb&5s#hw%45^EL6+6nT-c(QHH~<+j}&S$lt3`_2=jHOx4Po;`u9GBHCFwxxr#r7 zuPA6v>s7ra&IJo;qd~n2KF^QIRVfskO2uJ$!O)v+!691&Id@3?7E3Wx=9o8S3;@6Nto zhka0nw8cnOlE_*b83Lu%O?{`7!;VrwP4LQHu=I$#18yvnlhVa)aiA6`_LShw2iEGS zN`<_&tYMd(7WNKWlIMb|>RUL4xE7A18kIU5H{PY(QJerk??TSZxDdHVp&8aRx)>y8 zEmi#m^b)4t242JLi6+ZNkz%IM)gRx~hZKKfc z9%M&OO#Fo`7fR`WpEKxXV-%u;k*xQ5ErTAO(v-x2+5uscnXKlXj|ubRZF?_70FOC= zM!B~>IeZ5*L+308uH8!IEV~$t9SZ^57{p1WqMX&zl%SUz+4nkzYF#uptvsE@62C=5 z@u_L=BoM*zBKo7s$Uj4dQEryeZsespfGb$}L$t$xZ&dn?C{m{y4bFjbC^t){K+o6N zSNhE3N_Nk{c_q6;1rCD7mHgJ2dUnx!%PTED;@XdIp9@bfShtJ5;*4R3hA>ap+|J?~ zh08w+!Y~j8@I9X*V>`O~2Z!QNv>>_)awbwpKjqm;5b{}6+Su_q9 zizG}&?(&J4cB^uul!p#e1cUlYU37Sa_6?OI^m1!Zz=A+#`JR$K0}BZSuLhM9`-dZ= z+uob0)K8S!7Uf!#7d?z>#vGUfSHa>kJt0`+Wp}}tD@c>9f^+y=<_~q^KX_DMea*WL z!Y~X4(A{5=u^m}?h#_J^AS4)(kV)NQktSB+4yfwClfn$%u6(Y&-pWIuA?Gnsl{K-` zo4$ndW>K#I0``;z9ho!t;%SfV6Rl?odOeV0gNlWfdd}t&g&mAgMuxj*XWAh+xYo*F0Mzsh|lsL2q@$UuZ(t5Pcz4q}Oo~Ll)dr7zRQA2#tiTE87st+7gS*k25^h@)d}fbEYnVFt0jtav z8h8QLD^@1-`Fr(vg0)}M0=f_!R#w)eGz(%etb@wWIBZ4GFGCQKpXu^C{K6w zgE8y|l;i;I2MsCUo9jQ_G7z$k-6EIu(M`m@=hzj%Y;mW^ot%%Fy_rucZ6L6HVNi-} zn+76}%M{RR8M!B4vYR^#I4x_tKU{VoCS7O8;^tZ^VzmpU0b|jX)c1B9sk@4|=!sAG z>J|WT7=9)GG0?R!{{!zskun+E!h8M1V1|atBsO8Z&@b>;)PS3bm$YW69k03woZ+3@d;9_Ggo7i_VrupV zg^oQ7!Y~v?_xCF@wxg>b2zC-t2OR}@rmywUGzrP;Af^A^gyLH7de7nB?cTpV)T9jt zDxw6|@|2IKxLcJQ0E<0EkDAntdvEB3O^20XvXa_l#i-6CSfe0}kmHA!VXd0MYGG$p zOL7g|9)jyA9P6T7E4HG>3I5}kG@pfh%(hF;%*PD>{yZvY49&!Xd3T=mk~qN^jgd`i z!!Qtq_dbOdS;){$w`ofVS(cDM4iIE{><+bl(2Pn$$lWVjg}T_OtDQ9OeQ##;yzy_o zs6lrsfFus6`OFs&^zv9f6@^s>$SV!vgvNL9s+xDT>kurbYNYx1L?aSAXDJ#80zMgR zO;c%cEr#P`)u9$mw3^XbaX#zh%K@F9a9$!mwz0DI+KDJhFR0!%KR_r|L zqY8|DmCCjFa9H1Ux4_#0U{aGZsWaxDoMJ^fU z5O=3VFa$h4fB)yrj<4)m3=squYC^%zHZtmVwXB^>FrYF7^bHLh@d(`w_K`5zw4JV0 z{Rvf}NB3}izeEb2lKBcn>MxjkQ|~LwOyN9t)2R^2^?+3tI^gGiR<-Md(>zlO)tJ>3h1jWG_wFbqZa zo+1N7I>J~$3>+k~5~qz?oXBy93UT))DiRV>!P~dq`~PxFLuwq_2^e)24pxjT3G?;X zo}2ginXH6JY6L%mLFN;|19c!#hms=SqrCzJ@y~P|@4{hNB^&)v%*riUdm_=*lm&5&X~OGguOhL;_hb2Ao)M>D(zI*(LEa zK9hp8+$&yT*$Sz(l4e><)&nVPem7u35$lmCQG1$(xV{fJ)zQCVEs*W@UEDKIFOR6w zP+gJ5!jnp)rA&XT9U;!4K0Mm(D-hZe?0S~x4$0LkQmg1P_F&psHStAH>aX^<5Ub+2 z)gb<<#qvP?SX(!06Kxj(N;j!6;UZa|TkUqY= zsx7ou+j$-Q@A3@a!F)m#4N8$?WwKgwn>XR$!hn2&5(jJ?JH!p4a#eF|#FUrvz{NiK z2F+VrZ`(!|e$TJ)Lx8wIv4|ZvX}h~v(9}p`O_N$)?4&P*EHSncne*?X?1^ij2A6Hp=`f9?g;M($%5gS{v8zqrFOQwDp zz54#-)!F&GzrBY4&R%`@_ZKG8%ny)s@$SuQ13L8WD+VOzn)xwu&U!LJ=8clj`IQ0Z z&H1~xKlY;q%)aSEySCmZEC~ESfzMu_Ul7=t#YInCw_H_{j?+#gT!vcKt8D#|*5*a+j^Wb!dDuj}e z!mj-Q)a|;yZSfEsTaFtCJPs%;VO+EKP8ji9P&Pso1S^Cq_zXJD8D%B$B$0#=M_CC& zWRIdO#8D$Fve2g~<8aWe6?l#}K^$cljte6zit(-Iy5I$s*lZ>heoonjBT>f)qO9Wi zrTrK><2hvs+mGE*6^>xaAUu0Hki-Lj5{SfcPML(~t_GGe3m!jq<8UflRybKlC|xVqh+W1L zO}SP$JFtHJpefr52g=bFZ7;cmI&&rR1lj%i9&|v^Yg|d&h8o2{+Dp)tKWGFZMmDaH z(L@aC-a?~lL`oNI*IP>QNU~j2l{JnqQDJCk41jpi{$og^2AScZqU+~q z)Js_iNq2_ED2d?78o2@#Fo^e1*Gwv0IDkX5W+*(^D1<`$0B>*8XSI^xr|pivJI{gWXnZ1 z!lgcN;4bfCvL7$^5E!~XxPc9Iop9UW$>l`X5|_eFU2!RyzfInQY>zwcF?A+WU8h`9 zK!LXFz?_#jBVEs2kM2tCC41*`q<7uqgCFxDi0q+j)~~hZCZoz-gfJ`FO}Eh6e!6xW zm6J_IZ4N0W+p1XRYZ6_5-Hy|eVl;2vBZPaBO?C&%^>2}3vT>auk1^T0LJI9E&wpg6 z-oarr-=6Bab;S{V4%w(jR(PcRbb@sc#kJzG_g4u7ITz zlbf8%1xgPl`|gS!RPODe+)5FkLaBnT<^U>^DsWXWdf0C4cupwXjVyNPU$emR11I{R zaw#RchJ_CET00xm&?35Y3)vDXotScUk;3I-NW4uCZM64fN)TwSzOo%B16zP&PYi~P zH*T>T=^7h#8yS0aT^7J`z!<+xs7+)7EbQ%!Tx}a(#mYY_;J+u^Kro((3YMUfW=kg|LzDSyIG zHx!NJZBmN+{mD!5g;~gaxqQBmB7Mxiq`l=(Vz#TtG~aCxQbacw&X!-8og~k;>2HS} z-pz%>)d^_n`4j-()o&0tF^*O>dl0W5l$-_Kbt_Np0AaAzw z?T*eoTJGI^@%g^UciHmW8vRc>2<&sLbEs3$P@Vb)8G9p|<)n*;jxbXfs=im7BewI+ z=Rxn3xvW#O#*>DJ@AHlu8gI`#?Lg0YzDEB)CqE-tGzS}xH3v^u#nshqb+P1Q)=|6X z>ovZzXA8hP(_=_l&bRX;i1|7%vQ>6}1W7{g$Iwy!__R*9=@CSwzb#VUR31Ur$N6gA zPYgX^!0&Al=1FLman}Z?Myu0!?*Fy9iGN}`hJ$L+ID{x7bO@u`i}Yu$Hp%BK|C$Zt zfb!76hp@8UV_M9&IM?+jEz>N2TxB$k;BC@uS!S3T6I`o@xe+qxo|rc_tN#+ZC!K2X zrG1pVVX{s&Qyac5E$VJ5KdYWi@#HLTlrN|E4#^sloZbhMaC#p`Du>=~8p*3o?=^0p z!CMk))BB-9n$x>M4kf0XzzgJtdr1k@#i3zxU(D~YKF~_hTSR?lR*m{y=CD31AZ0Z8-(dF@ z<5=@jt#PbH$68rSo%n(AP(DOrVG${N&uP{a4OMoA4YvGL=cT0t)rr>xl*JXVvagwa zZloH+hQuP>?AE=sQMQ8(3FYT{J8&7;1`e=->T@~>o%lu@)|aN5u)g?x!!eX0dxs9% zVm;q%P9}n5^Vapn@6t)0c6aO5;-r+E;4*ZxEq05_UmSGcgzMYr`8t@W<2uBBx@Ej> z3sCcGRn=;VrU`-)b5j5xefUpM=bLxUqu-=dT?;I zTd(^_^yK#Vm@-}5U{z{aKUr-#zvOpQk*Z9{P-OMy<=Vi@%I;_I4M~$6Un;2Z*g_#Y zhLz&i+}Y|JJK_sh^KMLD#q2ZGAx8f`)y#I3xQEw^N+9cwp&YKvv*0n8EfxChW~MRR)qQ|RiDH_D#YKKK|> zJ+0Lg;OaX&|2aMVj)X__#B(jqvI>Z)E{or9=t-qCQrgiH0)Lkx{ zu+`>@uPk+`N;g29VEIz2aXd1r-|Xi#PC^S=rGYqaKN)x%SO)lYm5h!jP5a^tz@+{ zGj85G`PH>s_nJ-5ves*2pv6TR^zE}UC~LJ9@|EzxYlAv*XGVoM-1FJ# z9lR{y(9@S{Ya!QWTVwj$Cn9sER7_iC=X2m;&hx!S8OiiACZ zHmN=ID0p<0?NMYqy@uDNUZ{Q9>F}{qB`4s(@Y>DE{u5yQ0ez59OT;h`#qa$Tb0};V z%7UO5|FDR75Ecc+y@-TqoW|g6S~7_s%YJv$x?639okJ2P`Mr60m&^9O&Gw}kMPL;% z+x|4#Sh3Zh8z%u)&(~^w`}lPCa1U27J6oJAPG=XRhjny1*v5fUJ>#Pe#WL;I8OS-J z676jpRBf4(h>Of~*zU5Srb5Y(HLf^FINVSP`6qIuG5C+v$Xs*_R%up0yt^v_y~i)e z(Hlt?US3P6nuZ~dLQ071)U1(ZtUpz!WMOb60RwHw1v$!Cr#ZgSfOR4K0jAFlg*ACe z$6|gCd+1nJo{W`1{w968Lj5sG?Kg`9(GTBc-@TYyPuo}!$KU%Y@_+=D_JNQaQFpcS z4dUWUY9FWY6q&>+UIjafoo-RJ-+j-_Ndm-wJ7v{w9$LtM&h0mIX6EqwpR0$}yX|MT zjEkaGrt_zF-|6?&=6;#ZS|`bRov-!HVv(#rynFfC8Z0*1tW5K)^(86&Re5%jujtqJ zt?&QTS@~3kzA$AX&(rM1H=81vrrB({nJ3d#Ts}x;5ig76=r-U6!g4KVKRZdY)uueY{_(ROuCiuG zyJhBa8UKt`Y8U!NKo1w2r}398FOst+BNYyzQ$#OgYsn{J%9G56i-t*p}g5=^mFSZzyB+lQKGNbIQV%z6_<=@@w012 z?MjPZRvs&erun9n$9aY6=os!SruW=h)Q@~Uj$4PRs#Z;_9Yv(3*n8tAmR7jV|K*E) zX{}>Zb;BB0S!k-Z>0U#7U}TsAh<%m>;W5LMKgyeS=UukyAL$Glt} z!re?Giv5`UeoBT9aW-GdAlxVHN7-Uj^1(cjok((aDs1y^Dzxiq(GxplXQqlx35WqjC9BLZb*fQbjLStK1IHujkh5v z-8b(@gq+xQZHy@r!YBM~2+PpM!d5y2W>}uEI4~eC!{#ktKwgG#vIt=rzC#*>CAI6o zkH%yGc^SUzTI|IO2+JfVT|iW(#p^;=<`sdsfS^p9DL_c3J)ye+37NE92l6rL03Arj z;>!l%Sgvl-@j8&qm2Ej@$TzA3(QKo?1L0ix0WS>cTm_m-{_H?LtZo;EkVb7v5RlR6 zf+Waj)FBBn8g)s6j7B|@AfQp7B#35YX#}6F>TXsA98Z+P}m-E>_bwnMk%NdNx53^DYD3YeMm~? zr-(#|%C!X5wLS#pMvkymdhA11p3nKd4^eskEhH z1ISFuMqrOA{00!5uYa@*mLWGj_W)A!$6{9&29TV;t7QYojR!(#V@)!legYyJJDM%4 z;4N+X5;7YH1mqI(`a}vu6>tj!AqBcY8YC3ZIW8fgfVT+Q1cGOTV1h`e-r^Fnp-34* zE}`bqR)!GCJ_?4AN@zJM3Wg9(Xay6F!6C#$vT7TL5K-uA4#m+BQVPeKp(clVpu|U%G?E>V`Spa;U4cCLyL44F*1()_BjM5G<`cU1SWRv<2mFdxT!sd zv?%bmeR%sE0uxuhuR3aoOpI8Ayu`NVwsAKuY@tqt8*;&IFK)&K?+7>J5lawMUbrbn7P@J(-mlRO z&6{W;n+)nqWb3VMA3=4;F*Tu4ZDpfjosq18w!@2Y=L~IZ&GFTvs$FApWnaH|!*DlU zV-|6eZg=VcQxtPrXm{!eQ?zbP>JX21C92)2qwLCZ!UlDWWpBZ6#ZDbyYA)o<%VncF zz_Q6ud+pZY^|T4=b!`1es7A8gt>Zcl{Oj%Gzum1P8_HC_bx^kst$bPs20N%*hc=94 z=mng{x^-+N6j`p-JGxuPSJu0)ey7=R+t_rQtwLD?_({=hw(Zh?U@m1jIC5IbB&X`{ zJWUhs<7?P#sD-M8Hd}oRRs0-r#dyS%9r44h>zJ0oRYf`CUyW7Ua^gl1edjCmzyqn` z!FX-&rbsF^NCT)=NJJO!x{}n?AjU>nA+e*8UC!42dwO&MT>+ki=5$Z@Ij38{{c+eG z29;k#_bfS3pD7D|@TbT3ejFu2QITN~>$CE^ax-nd#C2-fRbZmFT7RFw=Jj!&M|Zo6Z}=hSZf=%z)30QmS?u?TAY_2#9wvCbt-OcA;EY+ zwIh|(u&Gz=+H4bf?h?w^Rg_QE`(R9l{{$`+Q$b8_gXs)E&DEp(1_pqhYMs%2`r zwAabz?H*^AT@-TDmA{-F<>w^aRld~8D1B{EHH5M9gUs4v6f z3@m42)z!^K>pN8-vXN?ioQgvitmVj3GZ%X{Zhf5!ptJN`E#DWwPyK8Tycv}QC4qiO zlSFYCe`S2|BY$^DH(}r_&uQd~AdVD5vRpj%#fWlF-<2WdFUc>;kDnzO%@EGMrz{aF z4a3n;&=(T1x3Q8v`84ubSPgDP)9rRC#Nl=wb1@piKVE}(;T`6uoHe50MxV27LgLN8 z#|+KjL{PwI$3NSgs1VO05zsIx>8WOcU{Os5*HOWoBpeNf2ev0Xjs@`<7s)t(ap1u# zAjmiNUc8Z~#NW{%8nla0cQlGv*mZTMJisu2VPc#s1UmoqPldW>Bp}@kKRVAZAk-M@ zfPb%ncz2*_23PTSB4T;DJb}BOfh1PX)Xw!rg}>{_2JH$W>11QY4fgDnhRSfu=r#-@ zc2+ATsyA#sPp{fs^WOiDCcZ7YP>(hNdUSG+AQWnH5m`&bhqB$4zA@%kCJR?yQG86 zHP4?leOV(EkUzj=?U~rc+wtINCAvxCFa^d+PXTBbgXdzHavp5id7kR)VkS*o?!t}y zbAEupR~4d0oy66*ROb+`8RHdOwFV*EtUYx0EV8R@&{gtP9=LSLoX7ihn7#zj=x-H9 z85{vwAnk_w->SV7%@m4W^RXJH;IIpN!gpeHG)XLWj9)vqKn?}>o*Y(LT${^75Jb=O zR2=<(3A={zLeNw5z>%6l59Jc}J?$u17J{ol}#v4aN|2%DF;km*Kn3flB? z-c#*=jK`(5{|AkbK@Wl;7>4is3Jz`QUud-sU9+{-y1EbiR2BjQbaSr%o@NK9rg33| z=i%l3_D7Q&(l0K-IeL3Ukxo#O=6g&`$)w;kEfx1dE6Q`^&#To8n2^HPA3O+mlxZz# z^CIMz8OK~J=WWS-&~8Fybdw5+3JRnLy4{9DeQamw&%jW+E(@%MdWF8&Q&*|Oh4L%# ztt#%d!GB>p7(nNwQp2Lv-Y1jNb3>b$#$qD4kIf*lufIva!(8~!N7lr#=Ago*U%$v3 zjg(tU!!R7h-}5Q*;KLk(^A29nu8Xs*ZA!Wc`Vz9Pn}w_?O{&P)cQ=joj!pB_!0()# z^H1pIb@5byW+j|S3FG?!YyjBr_rXmfa;ZRn9~9M`X9+ZW=+gM!g;#KJ(Tat$hC68I zaEPeuJ8`Vh!*&!!vFGDZ`w|TwbvVD~j@!8jA|djr?}f-A_F4@dVgJG2t%1q#)?Tgv zR6wi0VPkI`U~gpa_Ys637YEU7ibnRXIGWPwLxk$&1KYi5wmIWdVyRF|MrcgXJ8daY z)A1eg!ig7-ji5vNh~UT>dcHR`;~$*ZC1WQDoO=FU8izAOb||VJqd_~gj11VJor}>e zeMAHsL5FUx0Z%)Cj(dmn<9b9!adrVdSHmu=JW-j*A*DuER*CBE!p#=^k0zy%@|p2$ z!BpB~WyxOQPEm?EPuF`e%N5+otMxoBsaVpb;0w8X4wqao_1*Wk>nc^asJ~=S%PY>cq5eMxVv!otEqDXfSlw^i zHV}XJU!eyBRe+#CvA20c&^ZnoU`w(%+f#soqG+27C93>LlNJ5nca-%(Nk>U(i=y+B zc;tQmcz5(KXT_mdEOL@DT@cEmjUd`^djGb_Rtxvr@tlZ=0$JCau($ZMC~P7)ji}7E ziT>W)ZZEH|qFMDu(f?H9eNZ#S ziQxaT^qgxanF9Ho7*ZWwoctVl`YvjRtuPAOBZi{78rxwKr!UeOo)GM!u=t z;QVH}NSO-8C=?yVpmuDOlIlXq?CzlCN0JB@-#4G2t^Nd+wZktFzqZ=QtW*+v-(_@` zv`ZMO2#79-)$Ep0sZu!XF#afcI>Drvwpo~K^mc8V3|IHeC0g;s8kTzbb~0NB8o9hl z%t+Fp-1|l}+KH}Imcp6Xt@?p)jy4dD`~(TS8|6*3WEaYI~U zF3YnOay_4hR|IXh+k#A$)27ha#8HM7=;(h-57aDIRGm6317qfP8|<{fXdV4_PK3bL zw!zXw+}VL|684`=52NcN6%SNjgl6Uzii9gxVqJ@&dD3ObPsGjESriu>Ri4ZN3e7p{?150j8Oj?GgH z5eMkoEMe+;w>5z93*`pqo@cv3>%dnPsoI*@qi(X1SB+tk;j$sl)pno#tY60HiW z1Om)}c~-Aw3eYT}q8kE+Y)r%-%p7Fe>dwlw?_2r9@cTCzLa36&+5Y zzA>#SFK@e0JkYX%7beO=H3mE1Ohv#^UQ4X&;T`$_Gun^WpF{0=p0(epIgg_43he4Y z4ZRg8>z%9jCWKgh{)r}tOuj=WqH1wl&2~O6#RIqb6|W2qBnVp z%&aI{zVO*ML+F=1_6CSSvVLt1m6_M*<&iKoVby$nZNstuO3I=eKjf7}iArO??D>D) z;ZSlVuadMh$I`WGg)fV0Wb$dv8zhM7<{t-`H%hO%FV89P&V*{`5evVgo4v#$ePv0Z z&sDe`%!|;-v?lxEzIQ^VR)ht31uFa&{OWmX5IV&^Sg3XQL*e$g*`09~V?8mbckCMc zP7)@X>i58&Pow1{5tiXI&$OLgt>G~wFooc3FeZ&g31+I$FgS~6(&%%U5$?Sy(sDg_ z^11+EwY)?2%3SR?#2i}g0#@@z&Ks#rHEb5}Ia{5QMpEe+TvQa? zX+*@ImZ|5K|ASk4c>E95R$Xt}Fcf{?uRs%8snmy-ty86Ks!&NwBpOf>*1lQBxe%+4 z9oY^Yn)csk1BHYnB-_KJ@e=HN&bc4H*U8u0G)~|BZ@)#xiKc>gl#2U^2+o1%UN;s> zUv#>ukh=4&)9+t&Zn2bj-RUNvV-YE{%QMCf`vfyK$K>VBa^Cs*tKLyW)!vr^rHtV; zVdoZcSPD(ChNzZU$zM>u1er?84<1c|3x=0<5tl`9renkfhrC3lKysWwbr=-_DOT!L z$f!!h)_iBKNvlRPo4>%?WXURHv$7k61=xk8tK7mxJT?&j70I6n9RBp)6TNrHJ~E34Q4EW~0=Iy1vwC|d4@X)`&Bq(}l; zqB>i=h_QVw+erWV7LBoKgOA;F`+R z-+k2*$xB4#Ucvm|-3Yn5Zc0xwspzU@skezG70PW&XwC@hJu$^PZpC6PXw~l4Nui7y z%O%)pu)D2Xn+A#s5|zwqBD0Y;9pO<+W^+b~eZx>r>tER?Ge2nH$c$WS{u%d}Eyb<@ z=1k1ZL##l)N~+7ZDb`xjd8Xmi8@tx49p)9(Ic{;wHt5?o&Q|?oDL1D;V$GSVV@7|A=Ou8=||>zz+(Nb;zmv?2Lo@Fo(|lU^Wgn4A&cs4f6d8bIKTg z|Hh~#peJ`2jtu4IvKc#a+=o$U)4Og4+t~B@6_7#bJA+5_7`l@dAjkK2`4<4w$$0E~ zbr$D2+?_ysX7WOWr;bZshSGawYc=9rEUi0sy5{O^=%}5WVMD_<*!j zs;cd_y==Owwka!BN+^P)YL5dr#9Cup{!kM|{qJ=MD2p*GqWS{N%zJ+G!F>KAc49U> z1qG$h(m)2R%=vzHY|O&sloY7oOlg!ou99Vxp$Bw3pLyKT;z#`LAx;akHBO*lgZQ2Nwx)I-gy~@92M4!WV2CF;lZVz*cGn1JWLKxFg(8onV_yqud8p01(!Mu z3?o|ETrZPwf8RFNxuqpl8nnax6H8@Zzq2j(NOQ$d4&_(EKpw)N;HB+xQ0xqQj%~lK zkeeG{c0Q6!OTwxvNJh8>7=@d{u1P&MG(Moj6;T??CCO!z4kh_{YJ)CDU7+l^Yx(rND#?RT>jF|(~$IN+zr!V+D$Y4_|`-?vJnOg!PFw` zX>(;oQgVs#USn1&6zvNvT9v(RmTuznChM=j-|_nKmvww_9II$$tsfn0l&04DY5t;6 zuAI~`ZM)J}<*Gf7Iyox=mX z0DD?CFkDdiiM&l@q}x>eVo(Fu!xvgHnzF;`kFDW;_Z^K*c>w~>Lcu}cW=u!p{xgfl;l=SuNN#RP zh@!%T;Ck@3wj#r6LUJf*%k-s%#m?YCN-jDH-!E>*<<#GuyenZ1-cy0`9vNQ~LX8g` z9bKePhK0t4ck7;L?056mIrbY*tqD>lvS(GT;L}9sI6o(QX426{r-|1E7eYSI3YsAkMhD*3 zT4uYq=bmr ze&4Ui15#57Rj@+G)=d>kS(}N53expqnvhAH;^Ekl?UZ)a{`<~2Dhc7~cb~s} zcjx2tMY2rZ{d+Znrz=4Z6qY4QOxTjR4+h z1iGH9X&Z6Q#GCm;&!1`ZSu=b*oXtiW-0OU7hJU^D9N&c_AmM$#8Si?|`0jGUf7b7x z9-wD(b2G}+cY1^Vhy5vF^yGei4WCETjh?eX@3i0Bs?twDk(Aag=k(pnCXfiOaG-E# zwIunCGiWZl$*2e`F3Qn07b`3(;6S2sGW3t>f|9_BQWhw}nKhpWoJl3pK-q*TBd2Xa zgs_K9hV{idy5AfD?}vmy&qfHufBZbQUjEb_5O7LCjeQXyO3{L1$Tgu20ZS>}p(y4H ztQBpw)q>?RRUuz9yB?J;Vxnw+DKHAPO$y0X(|edCpBp8{@wQdLk!LaXy@E)bP#j~X zq~#b7v?0JE&?D5(d~tZnviMMYJq!XYWw~#Rg!4UeQ5a5fWEbA5RGekXR(4kNRsvpQ z@ra=;5u$R(>T+2@WuCqW2r(@Q$S_hNm51Udg;{8uW~-rmzzQgx;>jf(k<*kh=-)bh zL|!4WKo8hH{$wp+GV3~qNFR%sFa*vQJS{?FEP%5W2_A!`9O}9jL}^c9$Z9QRT#@Lx zf!=^7a0S&-B|NDg0gnQ2Dqy@9ln1M}b#ijjn%BR~ z8jo`_V^ZkcaQ=qs!ah0eB6sN5r>`EpgK+%Z|;-#7hP zlkd9>UPpfCDk#r?y+T}nP49IPWh%X$}i zzO^6LWSfUc+#?S;iG!?HygB&uV7t4H!ga47#xY3?z{i9CC>)$!oQE6IWK?DUr%E%9 z@BJtY7Jlk)_9DC>exPV#LNfKE8)!NSIBm8Uu|s~}ku0B*{4NRh6HBtpza`7Z?S7`Q z<8=~*@$FO8d?7$#cX11e$CGCjZM1D?y zn)sV?+^<3Dytlks*xvcC<3;Zuy`#4u5#Xfh0-)E&HQ2#};y3S4-qqFQC}*q5gtp@F!@Hvs(6jgx zxHr3a&3fDO7+Jbo=Yu}<^KAxX@h*yfkOKjy+ie3F6N5hd>vy2uM7!*cW18{43FEMx zq9n?4Kd;dGYw+cd)waCq_1SRtVt+$aj`g8Fj$4NM|9j?t*fSzx^uoOG=!M>2Y(vpB=tcS>Z>&U$K8?r^U8LYh-VRCcQK#2l$=ieG|9<2Cqb{D zLmaETxK4t{%8OJDl^6sZdhIoj3NBc2m!Y6x5>%z$ft@ZPh_ft2ea~Zi<=xg#!HB}D zrlW8pI-%L~fBPp*p8nM!zlAIdY%%BI9|S0E2E*OoZXxLIXF{4M8R*N<*kI(iEgZqoB_&6M7einp$_wGAp`wm5H0ugu zQY!d;$n8jl$UqXGAN$A>6#b0-Z!S-nz-Ho90+>4V|2?IFQ`kck#qRG?(?NAndJB`e zpkVj!`46q@FU5df*)WMA&lIC`7X&9qj_*ap#EW)Ff3_GV|+ygL4(q>X>U9tTeDpL@%PBk-NA=>K8u)oL@@5g+;UL zK(@BjDY;8&!!^*abfL`jc2 z;x3MLTLmQd*LQk56^PrE&^R(sb0aAkgyzZCKw3)ZOcukgo^dHlMm6iIrdk#aZ`OJZ zg3)a2bUvrq?rSWa8qc(u*4bokEk&Bu0KzJ2JUa&{y4NZNQ0jC&lkSQ3s8Ky+5 zr)$o!z2+hRYw@{*KFt48aXPrmr-0nttIY~XL~_jxLW0YHrlbBQ>%iR5K-$1;O+6C` ziFE1}Iu^>AaTtR)d=`VVDDj`kLi(%c@ZjU;Su8|&>*mqr()k>C)e~J=agmyAr_L(_ zgMd_;i&SP*x8Hn-*y1>(O-M-FghHY+j+orsz!*NK!mZQY9Siuv zS`IH*Z3x4dejc(wd4$?(IA73^)+jh~()lIT`v|qxWIp^%fvCM!GYLiwc4<22U2(%Q^O9?y!EwZFgZ0KhIgO9ii4^2)v$)T5mN|SR8B2_siV*>@Ij09-~HFEk+g_ z9ml8{C)TOW3UjC(r?zv>Xi-C+TCP1A&uqn1$EZoCpRM6?d^ujy?mR}VX$={9-ITI3 zj=V!;MwQSbWKKz_rt~Gj*6a!^jJuO!BrGTH{ShKw#ev`V$A}VjoY%+%S8;G{#tX-G z=aWm@yL^KvqJZBbI+S3XyS3t-IUXXs8E`Z{=LNz#YX+SyCsV{nFxa{4&g^rIF@--xdo@@SSsHY@0 z&{Lv*stPh#fs&Z6_cfxLWd%hRWVjhE7J5k>Jys;u$=Gg`p$HHlE34H>WoR_Kj*Cdy zv#4rVv8|Lug-i3w!o5MCm-Hrn;%Dgz2iz%o_07Q+StV`vKrV5`2;m<&Cx_MNFz5L6G6lkD}xo2|V(Ur~aN9jdthrX?vIk zRM@_{871G_)fm%&9@}_pcPdY%lzXWA%XIpf-E4jLPRiw?j z;-`iitHX0n1%vPUwGDa=Eloi76_b&Rxj}7qh|n{<+$Uzh%M{`BG&cY zoBW9H@N>4gt2C@A3214=hOnLnU3?8Xd!e}-gZLp0ZDaSPZC`*Mq1K$*Q_kt>+^t$m z`Ggt4VC~xIHmx+14#Fury9p<2q)}bHd7zx(E4i>k=L?e3qx@#bE{XJKRbKdrNVAPC z$5m=m>Y#m>ll317L>CyRRA=m1D@KRcK^EbbL_kA#W%-*90{fnh{R(n(y6_aKzK`bE zqp`#Hp6cal3Gx=UL+j4359{^g0^@AHV%t-%59@{Nl8M-KJFHjbOAK01W+?SabAht7 zrwfMhu6e)$27BIoyY}<-UGw#(QZ6o7uz=cpe^V*x%C~_i>&iJ$iiAOe0dD^Yx7d5K z^l!2E(0TbZ2|@^CfmRT$)uc&;!mGt>4R{p7$jCxEoG`5G-OUY2-S7{TM}7yd@`#K` zlAvbT}H)~?3%`D^!DPOp*;{Q#3F_iqidv0H&}%zdKt=Acin zZ2{6|YbL5fj1(~RVuy`h<^=^|_b>)e({gkS(FNgXdalB-G}$Q|uS{y`o^edHy)kqG z4){DY)SpqH6{rp|VxDuO!4IbRgI76SxY=d7ml76Wee{4-hh|cUu?5b-r45*4Gn2yb zjkzyX??Oxc(DooRlT@WO7I|8@yFvf@F(-!76f$E`d~vBMg&{Ip3T+7YvUF(1y`^4= zaF+{F9x=@%2pUrvkhAq^IVARyYx9x3_P06YVWu7_B|(^y`cA5>*zt{pa(;=uCglYy ztzm9M*DUSr0KMHr+K6o!b`mwJct#XzPgNGot2~VOa!SL8-woR*xLxnUD3IG={M25~ zmh7~KN-G-cWCL-ga)7Ok73eN@p(wMI+=LJGAZ&W;Wkk_O!y+cPNghHYCVqUoqs6^` zw%cx#6p|jQ3@n&-QEtv=c;~0=gxmADsIluQoHjHIE|U+MSki#U9;vO9)Jvhk#Eg-h z(>w_hv@rH)wuEzNWlthzO#C;r3ROk+2XK##tyj} z(aL!yx7qih=3>G6mHq9)k16N+xjXY&eM>8+%DnIEmG zsh)9n2I$fQ$Gt%p61st@TNdcsz(bH1RAZ14EsKBhl3fw(_aMEi#(Lacv@uv$!nQ6X zbZ`A@#qf|I#8l4JnT}zu=vK`VYI?#jf9(eNH&>gZ4>884_FGS2p2}Ps1C1Qn|1?hd{j5)45KMo?2dCh$T0~)%R9rVKhzx->$g3$^Vm`NJO z6ss!yG_4Xf>9(<{CogvTJ5CrIvv0Os9`sW8-v2^rxWF6r*nkv*N@m;1FW36ri#EO~ z?51`);YEdI$PtE@>{{Un2Ibk9N=8qe%wHrPcSjX(#)I3S7)Jbff;y^NJwo*?vZp#LAJ7Dt&`Ixn`*j_l4;|9?03$KkLyVyjZac+LrGg;S7q! zYcqFJ^%QctRaJ=uZCS|9*Sojx4dj2ZN3`9C z$8XTiwP(ZmXgoWoB(^p6%8!+a_L-8=R~t5Yi8uQ4{eGo1ui|{W|SfR&Lo* zW_lcY*A6h=>oNF^JHWv$Chy$=!jFy7t6rJZ8c?~DscnyPGgI3h<;tU0R^u9`R$}8a zrdDp_N+z8%otSM}s@F5M3aXbhwYpWVYHH=F_an6(t=^KP6SD=0{>1!&yv&X{y5csw zXiF1FPu2+2BEZ#BXx@bJ3++PZCRp5P2YACPl~>xSgF&I>xh+^VWJLb2mx7wMz zKvCGWb_&L=M(?##C~h`-v7JJ3yV0xb6pCApUu~yw+;p|O?Px?%F1J&-#){%o^4 zD6Y3t1l*40{dVR)HHIuMxKkwDocxA6h2sWgSKKKWwgPQkcI>zCYFIMgUBZ@E(( z+^*J;F?fegMtPh}JMSwe-{{mjEL_b&8#+4%$MA8lQ#lOB@Nj=vJrc(dako-A7{~DN z7Q3s39A|BC`GrbX@6!e1)H)vzr{k%ub&C>HMsrsiO(iBo0Y!c@yDB(d+B1f7bc{2E zl-8QMo;8`we}UmNom$$4S5VKa@r0+ic;f}KV~rtWwjF2g=z{`Bg+$9*vD6Olmz6W2 zE?~mv9X=Q-&QJ6440tXtv<)e+z<|z`wh0uCe&7mzxwc;Y5^Z6*`kpJ%XtpC=Z7VxI z3SW2P@wUG0Qct#4Hxx?DGsilg!oVrg?AGS6T=UI`#u%h1XU=>I!}^k99DdN`u%5G; zE&2SwJB)sy?9!TyM|`Ykd(39RpY;{)ENqyJle4)qwMPQg)%I)g4O-?U=Ob;t0!(e! zwa)p1N2CB4nw;L+Azp~oj-pbj#hm&54;nO@WAP+Ov*IW|p(}F&3TzqWCx9 zWOmR*o4V)ixjRKD+l{NjaSDYSV@=V-E53GzC3+3S@eEBR8+hzHct)ZNgEYcz1C@Ot z56d|lnEZ2jVhsKl&0KwRqc$43NsrfBbW|*}cjB1ou&>n6S24yVtU5l6GU{yTr6u00hi~ubpCdc_XOucISLymoWMU` zuvU&-IAjpfPEM8d@eYn1@`h_?Z=AsOf$g~z^j7)vFL57^>-NL&vj^f6CyJae%F&X1 zm2GXszCorYWe~@{U7W2VlPZ@aah97CBy$E`h1B(1#lJ_7k0kOvMT*T29L zN%l#lk21^!zwN;uoFLtLAlmX^qGwRF;L_p`^&PoD{vH4JuUt(}j^|LYlr2a$p{s11 zSa}2hu}cAp7bu;x?pf+&*Aa+gJy?YY=$U|<3H>7M zw|EeQ8W5L&nmZbbt+JSUuJZKj%*W}E6Sf@sXr`U_JN#aVar`OKJ(*(i%YOg3^U zEzl`6^>FYj-&vzaty6{01YCshci`IKIf)$3WK{b|LJNmKP1Yrgak40i49Q0Ea~?y{ zhfj`Q_9xOoQ}aMH^mf@e@Vl0VL7vHt0&~j-L1wPeNQvj-EBputHVC&c>5wq_+Vjqf z%6^H9W9Lj_pmbUqP(vhw62qK0&*~a9aho~GM#8klb@TrcO~XN&AU~k0Lddoy@=$n{R)ciJnRL|70H+ximn?gOUz!bG5~}F6Y6Y=q z68|cf2p+Ux8M=^u%PAhbNxg>_JQ3F+l64vj^g{Pb_70Emi;dgkRg?{xDXTje`-3QB zw!vQojB3KYe(09tn;P^Xoi?zt5+~Wm!!S~P9}S|>_*5F=p<^k6E5yrZDlsBh!zdBv zSd17&&Nj{*YP{d=!U*PIOqn3^ws!JmXUAZd`C|hA9tL*t-sc6y_1*V3PJ}|cYOgP4 z90sVMG5@jyug^SHgxBXhc7pZZS%1}-IfkMj+K0$TEF~M9n3pq1A>h~v_e$vc?ocEONUGB3mHza+z2Ai@x4C;MaGFb@88*D!>}|#m60I& zDhBW(TLSpSFbAUOmLP_U@mN$vBnWG6>U~tM>~_mlKE`&GN$mVGp|ecQkKuYMbkJWP z9^>EzS&oyVT^^+$In3uLLG<33uWX%UxhcjLO)MG}>?>8a%x{OxR!JvvOG&kY2yEkI z$5eblU9E?=9%alv$XOj_A6-_z$dD#5;fF@1phQ`j{mZ~vXEqNj8e&iBe(l!h1={%;d>g;wPaMN9t8uhA{ z`zwfjgjS#yLu>hsaVDOvMikdM=Y|Lx%TQ#7#Oxa5&%0b)Iaw>W2`*|jzRrx5;KtP6 zWVKip4b@o!D#{2NgYl-R!vSf7bMfK{bVMFh=gf_N54B_;xK6f3Sl7*Gz)DWl6+Uw| zt*Ral25G3G$||gqT8mV7l5i*5L#dW1evarICY&tW%1msoRo&2Bw;8-pSU=sE|*YOxyM9? z_DnU^iEU{!IL71CW9~7Hp{<&u6mu)W+^gdh^CJ(_H;fOuR_u_6W4A+iu`i*+9@WJd z2ftTBkY@GOnKlqa$ON-6$J(@S3^43m+@C(trj~A?BQw`R6b#5sv=h_jWvcYWhW(41 z>nl;h%Yv>8dpc>-N-9c%j207VC5eRfL@M6DFD!PsnG>yrjp*8Qa%W)^DhlN$X?j^~ zP*~66>6_XJyD$%E%k_nMvSbKehJ~vYu5o*D0+aQojSzw!fkYN+rBF^-&Tp{@Vh($W z!gXWaIyE#u??Lp1(1Zn}(}M9~vR!ozlc2Se@JdQJ^XwVMSfm{opik!lRmJ4t*iaGR zLIgmyqUi`7IujvO(^Qcf^DGMn7`>k~TyDCq99u(&W}IMIDLJL|-_YdYsVNtpcKY{MXHk${Tuk)={K2TDy}bP&8c+42wSK*2U_wvQ%*h}X3R@5-XXSJ zGK1rU+39S&rehF*>Z+!-i}viZ`)8{t+}a>m=EavJMBmFk31&nbhhl28vDz0^QGYV@ zDU6BccY**B)6|N2nM?N;P(a3Khgo?{h0F`-f)JdF|oDjJp#0DxIEOUKG%QM(lKARxr|6) zIO#3sLlg2Zc%y8t;Y2944FL>{xkEVtRlNZx8Oe8m*%j@&*#W{aDbeO%&b1Z!K z>#NpHDoN$F8w|(l$imxX7p;qKyBwj%%MB3jmhI#0kb5=lh(#I6Cd|%7R$7ITkd&Xk zD3fpiC7`V$XT2o}cWF4~JSZNL``RE(&u%0`CcRP%lfM_JZxK0;Hyzma8gdQRXt?NG_Y!`E#36->N~<7kt?(=`WL!HjYlg!mK&qtOu)kdWSBkwwc1cOH*V}3{LThxb`#>Y>#W%NH-=cP6* zNi8irL%Xo=3~N4BCt3}LOF{x#n#7#IQI{F)$J7S8X?I&?IbvyL8DeSO@=Ink5`tV+ z4$V=Ml$w4L9i|86!E*uvH!kjYr|0S#FP1gB5Vo41c@3scpFQL5TAV6^jTO0F4aaqH zVdjK*NV{A_=C*k8;dgulIX@HDkZ?*~jv?>S0Fu4~5*LS!Ot;hnBzcHh_?C;R+6?+9Ws_TMaJQb8HJ3j`D6(7~^r>(HTq^ z-h9PW@x@o#m;kyWfT>N4do5211ry^1Uc&51Mf>2buog%z2?@#Ml8%@hEpZuj^ z<}QR2e=BH#?y*F4LylZ&vA6NtTk*@_OE4vTy1KXdF+}kSKMaAB>?079PN*NWK27^~ z0~{!(X)B>XhpNu>Vp^C{kVl>C>RiiH<~+vg6p}<5DA1&^!}=P1h64)LZGF(po@N@@ z_jWkXFL1inX`i!v#;Q5ehA>e>UbW3O8|%GaOVI)iAPSKMdS?I9!!L7n$)acY@-&;w z(l9FxD$*oAi@qu`Bc8+#OgG#ME8Jh0XiUc> z`aiA=_PCf299L)Wm}CbmMJ1U>=DXQNrVqtu@Zmq_5gI9HnJC1hl3ieqtr?CN)?J;k zApj)AwKWFNBNof9zMN7y@}DheGkzI=7TK*6y`2+KUymC-jNXeNwvm5mn9j)kA2N zN1tlC$RN;S)|Md&>TWR{GImvfGO_VZZD-}5XaFC{*@4t8aHRkQ0x2k|WvVmjbsl*E z7p_pAn+O-F9)j0N0Qse-&#n572&A?n3aRU8Vho^AYg5g{sdyb~u6>+0K!(P&2zl|E zkp+XHtE|c%W{@g&@#$r$E4MtFlUHH1t)Y58s1$N@GP%WgXjUw{4_&&0`Fgw2ylq|d zqS7N9!b$r^yX3+?Nw)Z!ofhsY$fSt{?dn6t!dngKu#`R>)rCD3Z0fUkShatLt{aG0 zVe*|Wy5>OW6CLlc@$NVjf0}_S)LCty5j61Nti@hZd!c}0Q`=Ajbe0=@qb>@4F$yG3 z4G*}O$prSZ@_;KwB^&rT@xcK2m2)Q?SRaQ*4Q8NH9h0{KRiqa@g`c?=IefHv@hvBv zj{9gn-QE`s&Y0i^>390--4uqx?DsT$nmS#G0wZe<(@=Y;>SOZj zKkvjK_+NZHh@Vd*#0TwDZ8!Joc){Ef6(MZxqoD9jK;$PO?Ewi5&�!3#FI~ah8UU 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

    E7P(r#CSN|SN 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 literal 0 HcmV?d00001 diff --git a/phpstan.neon b/phpstan.neon deleted file mode 100644 index 97f52974..00000000 --- a/phpstan.neon +++ /dev/null @@ -1,13 +0,0 @@ -parameters: - level: 8 - - paths: - - src - - tests - - excludePaths: - - '*/tests/**/Source/*' - - '*/tests/**/Fixture/*' - - ignoreErrors: - - '#Parameter \#1 \$objectOrClass of class ReflectionClass constructor expects class-string\\|T of object, string given#' diff --git a/phpunit.xml b/phpunit.xml deleted file mode 100644 index 3b137e28..00000000 --- a/phpunit.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - tests - - diff --git a/prefix-code.sh b/prefix-code.sh deleted file mode 100644 index 18430123..00000000 --- a/prefix-code.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash - -# inspired from https://github.com/rectorphp/rector/blob/main/build/build-rector-scoped.sh - -# see https://stackoverflow.com/questions/66644233/how-to-propagate-colors-from-bash-script-to-github-action?noredirect=1#comment117811853_66644233 -export TERM=xterm-color - -# show errors -set -e - -# script fails if trying to access to an undefined variable -set -u - - -# functions -note() -{ - MESSAGE=$1; - printf "\n"; - echo "\033[0;33m[NOTE] $MESSAGE\033[0m"; -} - -# --------------------------- - -# 2. scope it -note "Downloading php-scoper 0.18.11" -wget https://github.com/humbug/php-scoper/releases/download/0.18.11/php-scoper.phar -N --no-verbose - - -note "Running php-scoper" - -# Work around possible PHP memory limits -php -d memory_limit=-1 php-scoper.phar add-prefix bin src vendor composer.json --config scoper.php --force --ansi --output-dir scoped-code - -# the output code is in "/scoped-code", lets move it up -# the local directories have to be empty to move easily -rm -r bin src vendor composer.json stubs -mv scoped-code/* . - -note "Dumping Composer Autoload" -composer dump-autoload --ansi --classmap-authoritative --no-dev - -# make bin/ecs runnable without "php" -chmod 777 "bin/rule-doc-generator" -chmod 777 "bin/rule-doc-generator.php" - -note "Finished" diff --git a/rector.php b/rector.php deleted file mode 100644 index e772c276..00000000 --- a/rector.php +++ /dev/null @@ -1,33 +0,0 @@ -paths([ - __DIR__ . '/ecs.php', - __DIR__ . '/rector.php', - __DIR__ . '/src', - __DIR__ . '/tests', - ]); - - $rectorConfig->skip([ - '*/Fixture/*', - '*/Source/*', - ]); - - $rectorConfig->importNames(); - - $rectorConfig->sets([ - LevelSetList::UP_TO_PHP_81, - SetList::CODING_STYLE, - SetList::CODE_QUALITY, - SetList::DEAD_CODE, - SetList::PRIVATIZATION, - PHPUnitSetList::PHPUNIT_100, - ]); -}; diff --git a/scoper.php b/scoper.php deleted file mode 100644 index 536c0ae4..00000000 --- a/scoper.php +++ /dev/null @@ -1,26 +0,0 @@ -format('Ym'); - -// @see https://github.com/humbug/php-scoper/blob/master/docs/further-reading.md - -// see https://github.com/humbug/php-scoper -return [ - 'prefix' => 'RuleDocGenerator' . $timestamp, - 'expose-constants' => ['#^SYMFONY\_[\p{L}_]+$#'], - 'exclude-namespaces' => ['#^Symplify\\\\RuleDocGenerator#', '#^Symfony\\\\Polyfill#'], - 'exclude-files' => [ - // do not prefix "trigger_deprecation" from symfony - https://github.com/symfony/symfony/commit/0032b2a2893d3be592d4312b7b098fb9d71aca03 - // these paths are relative to this file location, so it should be in the root directory - 'vendor/symfony/deprecation-contracts/function.php', - 'stubs/PhpCsFixer/AbstractFixer.php', - 'stubs/Rector/Core/Contract/Rector/RectorInterface.php', - ], - - // @todo unprefix class names? -]; diff --git a/src/Command/GenerateCommand.php b/src/Command/GenerateCommand.php index 75a61847..dd94d1f4 100644 --- a/src/Command/GenerateCommand.php +++ b/src/Command/GenerateCommand.php @@ -1,83 +1,62 @@ directoryToMarkdownPrinter = $directoryToMarkdownPrinter; + $this->symfonyStyle = $symfonyStyle; parent::__construct(); } - - protected function configure(): void + protected function configure() : void { $this->setName('generate'); - $this->setDescription('Generated Markdown documentation based on documented rules found in directory'); - - $this->addArgument( - Option::PATHS, - InputArgument::REQUIRED | InputArgument::IS_ARRAY, - 'Path to directory of your project' - ); - - $this->addOption( - Option::OUTPUT_FILE, - null, - InputOption::VALUE_REQUIRED, - 'Path to output generated markdown file', - getcwd() . '/docs/rules_overview.md' - ); - + $this->addArgument(Option::PATHS, InputArgument::REQUIRED | InputArgument::IS_ARRAY, 'Path to directory of your project'); + $this->addOption(Option::OUTPUT_FILE, null, InputOption::VALUE_REQUIRED, 'Path to output generated markdown file', \getcwd() . '/docs/rules_overview.md'); $this->addOption(Option::CATEGORIZE, null, InputOption::VALUE_REQUIRED, 'Group rules by namespace position'); $this->addOption(Option::SKIP_TYPE, null, InputOption::VALUE_REQUIRED, 'Skip specific type in filter'); } - - protected function execute(InputInterface $input, OutputInterface $output): int + protected function execute(InputInterface $input, OutputInterface $output) : int { $paths = (array) $input->getArgument(Option::PATHS); $categorizeLevel = $input->getOption(Option::CATEGORIZE); if ($categorizeLevel !== null) { $categorizeLevel = (int) $categorizeLevel; } - $skipTypes = (array) $input->getOption(Option::SKIP_TYPE); - // dump markdown file $outputFilePath = (string) $input->getOption(Option::OUTPUT_FILE); - - $markdownFileDirectory = dirname($outputFilePath); - + $markdownFileDirectory = \dirname($outputFilePath); // ensure directory exists - if (! file_exists($markdownFileDirectory)) { + if (!\file_exists($markdownFileDirectory)) { FileSystem::createDir($markdownFileDirectory); } - - $markdownFileContent = $this->directoryToMarkdownPrinter->print( - $markdownFileDirectory, - $paths, - $categorizeLevel, - $skipTypes - ); - + $markdownFileContent = $this->directoryToMarkdownPrinter->print($markdownFileDirectory, $paths, $categorizeLevel, $skipTypes); FileSystem::write($outputFilePath, $markdownFileContent); - - $this->symfonyStyle->success(sprintf('File "%s" was created', $outputFilePath)); - + $this->symfonyStyle->success(\sprintf('File "%s" was created', $outputFilePath)); return self::SUCCESS; } } diff --git a/src/DependencyInjection/ContainerFactory.php b/src/DependencyInjection/ContainerFactory.php index 2de644f8..c8dff85b 100644 --- a/src/DependencyInjection/ContainerFactory.php +++ b/src/DependencyInjection/ContainerFactory.php @@ -1,77 +1,62 @@ singleton(Differ::class, static function (): Differ { + $container->singleton(Differ::class, static function () : Differ { $unifiedDiffOutputBuilder = new UnifiedDiffOutputBuilder(''); - // this is required to show full diffs from start to end $contextLinesReflectionProperty = new ReflectionProperty($unifiedDiffOutputBuilder, 'contextLines'); + $contextLinesReflectionProperty->setAccessible(\true); $contextLinesReflectionProperty->setValue($unifiedDiffOutputBuilder, 10000); - return new Differ($unifiedDiffOutputBuilder); }); - $this->registerConsole($container); - return $container; } - - private function registerConsole(Container $container): void + private function registerConsole(Container $container) : void { - $container->singleton(SymfonyStyle::class, static function (): SymfonyStyle { + $container->singleton(SymfonyStyle::class, static function () : SymfonyStyle { $input = new ArrayInput([]); - $output = defined('PHPUNIT_COMPOSER_INSTALL') ? new NullOutput() : new ConsoleOutput(); - + $output = \defined('PHPUNIT_COMPOSER_INSTALL') ? new NullOutput() : new ConsoleOutput(); return new SymfonyStyle($input, $output); }); - - $container->singleton(Application::class, function (Container $container): Application { + $container->singleton(Application::class, function (Container $container) : Application { $application = new Application(); - $generateCommand = $container->make(GenerateCommand::class); $application->add($generateCommand); - $this->propertyCallable($application, 'commands', static function (array $defaultCommands) { unset($defaultCommands['completion']); unset($defaultCommands['help']); return $defaultCommands; }); - return $application; }); } - - private function propertyCallable(object $object, string $propertyName, callable $callable): void + private function propertyCallable(object $object, string $propertyName, callable $callable) : void { $reflectionProperty = new ReflectionProperty($object, $propertyName); - $reflectionProperty->setAccessible(true); - + $reflectionProperty->setAccessible(\true); $value = $reflectionProperty->getValue($object); $modifiedValue = $callable($value); - $reflectionProperty->setValue($object, $modifiedValue); } } diff --git a/src/DirectoryToMarkdownPrinter.php b/src/DirectoryToMarkdownPrinter.php index 1b3a005e..a1192473 100644 --- a/src/DirectoryToMarkdownPrinter.php +++ b/src/DirectoryToMarkdownPrinter.php @@ -1,98 +1,95 @@ classByTypeFinder = $classByTypeFinder; + $this->symfonyStyle = $symfonyStyle; + $this->ruleDefinitionsResolver = $ruleDefinitionsResolver; + $this->ruleDefinitionsPrinter = $ruleDefinitionsPrinter; } - /** * @param string[] $directories * @param string[] $skipTypes */ - public function print(string $workingDirectory, array $directories, ?int $categorizeLevel, array $skipTypes): string + public function print(string $workingDirectory, array $directories, ?int $categorizeLevel, array $skipTypes) : string { // 1. collect documented rules in provided path - $documentedRuleClasses = $this->classByTypeFinder->findByType( - $workingDirectory, - $directories, - DocumentedRuleInterface::class - ); - + $documentedRuleClasses = $this->classByTypeFinder->findByType($workingDirectory, $directories, DocumentedRuleInterface::class); $documentedRuleClasses = $this->filterOutSkippedTypes($documentedRuleClasses, $skipTypes); if ($documentedRuleClasses === []) { // we need at least some classes - throw new ShouldNotHappenException(sprintf('No documented classes found in "%s" directories', implode('","', $directories))); + throw new ShouldNotHappenException(\sprintf('No documented classes found in "%s" directories', \implode('","', $directories))); } - - $message = sprintf('Found %d documented rule classes', count($documentedRuleClasses)); + $message = \sprintf('Found %d documented rule classes', \count($documentedRuleClasses)); $this->symfonyStyle->note($message); - - $classes = array_map( - static fn (RuleClassWithFilePath $ruleClassWithFilePath): string => $ruleClassWithFilePath->getClass(), - $documentedRuleClasses - ); - + $classes = \array_map(static function (RuleClassWithFilePath $ruleClassWithFilePath) : string { + return $ruleClassWithFilePath->getClass(); + }, $documentedRuleClasses); $this->symfonyStyle->listing($classes); - // 2. create rule definition collection $this->symfonyStyle->note('Resolving rule definitions'); - $ruleDefinitions = $this->ruleDefinitionsResolver->resolveFromClassNames($documentedRuleClasses); - // 3. print rule definitions to markdown lines $this->symfonyStyle->note('Printing rule definitions'); $markdownLines = $this->ruleDefinitionsPrinter->print($ruleDefinitions, $categorizeLevel); - $fileContent = ''; foreach ($markdownLines as $markdownLine) { - $fileContent .= trim($markdownLine) . PHP_EOL . PHP_EOL; + $fileContent .= \trim($markdownLine) . \PHP_EOL . \PHP_EOL; } - - return rtrim($fileContent) . PHP_EOL; + return \rtrim($fileContent) . \PHP_EOL; } - /** * @param RuleClassWithFilePath[] $ruleClassWithFilePaths * @param string[] $skipTypes * @return RuleClassWithFilePath[] */ - private function filterOutSkippedTypes(array $ruleClassWithFilePaths, array $skipTypes): array + private function filterOutSkippedTypes(array $ruleClassWithFilePaths, array $skipTypes) : array { if ($skipTypes === []) { return $ruleClassWithFilePaths; } - - return array_filter( - $ruleClassWithFilePaths, - static function (RuleClassWithFilePath $ruleClassWithFilePath) use ($skipTypes): bool { - foreach ($skipTypes as $skipType) { - if (is_a($ruleClassWithFilePath->getClass(), $skipType, true)) { - return false; - } + return \array_filter($ruleClassWithFilePaths, static function (RuleClassWithFilePath $ruleClassWithFilePath) use($skipTypes) : bool { + foreach ($skipTypes as $skipType) { + if (\is_a($ruleClassWithFilePath->getClass(), $skipType, \true)) { + return \false; } - - // nothing to skip - return true; } - ); + // nothing to skip + return \true; + }); } } diff --git a/src/Exception/ConfigurationBoundException.php b/src/Exception/ConfigurationBoundException.php index 94c403a2..29028c89 100644 --- a/src/Exception/ConfigurationBoundException.php +++ b/src/Exception/ConfigurationBoundException.php @@ -1,11 +1,9 @@ setTempDirectory(sys_get_temp_dir() . '/robot_loader_temp'); + $robotLoader->setTempDirectory(\sys_get_temp_dir() . '/robot_loader_temp'); $robotLoader->addDirectory(...$directories); $robotLoader->ignoreDirs[] = '*tests*'; $robotLoader->ignoreDirs[] = '*Fixture*'; $robotLoader->ignoreDirs[] = '*templates*'; - $robotLoader->rebuild(); - $desiredClasses = []; foreach ($robotLoader->getIndexedClasses() as $class => $filePath) { - if (! is_a($class, $type, true)) { + if (!\is_a($class, $type, \true)) { continue; } - // skip abstract classes $reflectionClass = new ReflectionClass($class); if ($reflectionClass->isAbstract()) { continue; } - - $relativeFilePath = PathsHelper::relativeFromDirectory($filePath, $workingDirectory); + $relativeFilePath = \Symplify\RuleDocGenerator\FileSystem\PathsHelper::relativeFromDirectory($filePath, $workingDirectory); $desiredClasses[] = new RuleClassWithFilePath($class, $relativeFilePath); } - - usort( - $desiredClasses, - static fn (RuleClassWithFilePath $left, RuleClassWithFilePath $right): int => $left->getClass() <=> $right->getClass() - ); - + \usort($desiredClasses, static function (RuleClassWithFilePath $left, RuleClassWithFilePath $right) : int { + return $left->getClass() <=> $right->getClass(); + }); return $desiredClasses; } } diff --git a/src/FileSystem/PathsHelper.php b/src/FileSystem/PathsHelper.php index fd532ef1..2a526b70 100644 --- a/src/FileSystem/PathsHelper.php +++ b/src/FileSystem/PathsHelper.php @@ -1,22 +1,15 @@ makePathRelative( - (string) realpath($filePath), - (string) realpath($directory) - ); - - return rtrim($relativeFilePath, '/'); + $relativeFilePath = $fileSystem->makePathRelative((string) \realpath($filePath), (string) \realpath($directory)); + return \rtrim($relativeFilePath, '/'); } } diff --git a/src/Printer/CodeSamplePrinter/BadGoodCodeSamplePrinter.php b/src/Printer/CodeSamplePrinter/BadGoodCodeSamplePrinter.php index aa1372ef..1e8d6162 100644 --- a/src/Printer/CodeSamplePrinter/BadGoodCodeSamplePrinter.php +++ b/src/Printer/CodeSamplePrinter/BadGoodCodeSamplePrinter.php @@ -1,30 +1,26 @@ markdownCodeWrapper = $markdownCodeWrapper; } - /** * @return string[] */ - public function print(CodeSampleInterface $codeSample): array + public function print(CodeSampleInterface $codeSample) : array { - return [ - $this->markdownCodeWrapper->printPhpCode($codeSample->getBadCode()), - ':x:', - '
    ', - $this->markdownCodeWrapper->printPhpCode($codeSample->getGoodCode()), - ':+1:', - ]; + return [$this->markdownCodeWrapper->printPhpCode($codeSample->getBadCode()), ':x:', '
    ', $this->markdownCodeWrapper->printPhpCode($codeSample->getGoodCode()), ':+1:']; } } diff --git a/src/Printer/CodeSamplePrinter/CodeSamplePrinter.php b/src/Printer/CodeSamplePrinter/CodeSamplePrinter.php index 0aa1a164..c1e43e6c 100644 --- a/src/Printer/CodeSamplePrinter/CodeSamplePrinter.php +++ b/src/Printer/CodeSamplePrinter/CodeSamplePrinter.php @@ -1,7 +1,6 @@ ruleCodeSamplePrinters = [ - $ecsRuleCodeSamplePrinter, - $phpStanRuleCodeSamplePrinter, - $rectorRuleCodeSamplePrinter, - ]; + private $ruleCodeSamplePrinters = []; + public function __construct(ECSRuleCodeSamplePrinter $ecsRuleCodeSamplePrinter, PHPStanRuleCodeSamplePrinter $phpStanRuleCodeSamplePrinter, RectorRuleCodeSamplePrinter $rectorRuleCodeSamplePrinter) + { + $this->ruleCodeSamplePrinters = [$ecsRuleCodeSamplePrinter, $phpStanRuleCodeSamplePrinter, $rectorRuleCodeSamplePrinter]; } - /** * @return string[] */ - public function print(RuleDefinition $ruleDefinition): array + public function print(RuleDefinition $ruleDefinition) : array { $lines = []; - foreach ($ruleDefinition->getCodeSamples() as $codeSample) { $this->ensureConfigureRuleBoundsConfiguredCodeSample($codeSample, $ruleDefinition); - foreach ($this->ruleCodeSamplePrinters as $ruleCodeSamplePrinter) { - if (! $ruleCodeSamplePrinter->isMatch($ruleDefinition->getRuleClass())) { + if (!$ruleCodeSamplePrinter->isMatch($ruleDefinition->getRuleClass())) { continue; } - $newLines = $ruleCodeSamplePrinter->print($codeSample, $ruleDefinition); - $lines = array_merge($lines, $newLines); + $lines = \array_merge($lines, $newLines); break; } - $lines[] = '
    '; } - return $lines; } - - private function ensureConfigureRuleBoundsConfiguredCodeSample( - CodeSampleInterface $codeSample, - RuleDefinition $ruleDefinition - ): void { + private function ensureConfigureRuleBoundsConfiguredCodeSample(CodeSampleInterface $codeSample, RuleDefinition $ruleDefinition) : void + { // ensure the configured rule + configure code sample are used if ($codeSample instanceof ConfiguredCodeSample) { - if (is_a($ruleDefinition->getRuleClass(), ConfigurableRuleInterface::class, true)) { + if (\is_a($ruleDefinition->getRuleClass(), ConfigurableRuleInterface::class, \true)) { return; } - - $errorMessage = sprintf( - 'The "%s" rule has configure code sample and must implements "%s" interface', - $ruleDefinition->getRuleClass(), - ConfigurableRuleInterface::class - ); + $errorMessage = \sprintf('The "%s" rule has configure code sample and must implements "%s" interface', $ruleDefinition->getRuleClass(), ConfigurableRuleInterface::class); throw new ConfigurationBoundException($errorMessage); } - - if (! is_a($ruleDefinition->getRuleClass(), ConfigurableRuleInterface::class, true)) { + if (!\is_a($ruleDefinition->getRuleClass(), ConfigurableRuleInterface::class, \true)) { return; } - - $errorMessage = sprintf( - 'The "%s" rule implements "%s" and code sample must be "%s"', - $ruleDefinition->getRuleClass(), - ConfigurableRuleInterface::class, - ConfiguredCodeSample::class, - ); + $errorMessage = \sprintf('The "%s" rule implements "%s" and code sample must be "%s"', $ruleDefinition->getRuleClass(), ConfigurableRuleInterface::class, ConfiguredCodeSample::class); throw new ConfigurationBoundException($errorMessage); } } diff --git a/src/Printer/CodeSamplePrinter/DiffCodeSamplePrinter.php b/src/Printer/CodeSamplePrinter/DiffCodeSamplePrinter.php index ae56ee79..00225e4d 100644 --- a/src/Printer/CodeSamplePrinter/DiffCodeSamplePrinter.php +++ b/src/Printer/CodeSamplePrinter/DiffCodeSamplePrinter.php @@ -1,29 +1,27 @@ markdownDiffer = $markdownDiffer; } - /** * @return string[] */ - public function print(CodeSampleInterface $codeSample): array + public function print(CodeSampleInterface $codeSample) : array { - $diffCode = $this->markdownDiffer->diff( - $codeSample->getBadCode(), - $codeSample->getGoodCode() - ); - + $diffCode = $this->markdownDiffer->diff($codeSample->getBadCode(), $codeSample->getGoodCode()); return [$diffCode]; } } diff --git a/src/Printer/Markdown/MarkdownCodeWrapper.php b/src/Printer/Markdown/MarkdownCodeWrapper.php index 5c60362b..111de4f2 100644 --- a/src/Printer/Markdown/MarkdownCodeWrapper.php +++ b/src/Printer/Markdown/MarkdownCodeWrapper.php @@ -1,7 +1,6 @@ printCodeWrapped($content, self::SYNTAX_JSON); } - - public function printPhpCode(string $content): string + public function printPhpCode(string $content) : string { return $this->printCodeWrapped($content, self::SYNTAX_PHP); } - - public function printYamlCode(string $content): string + public function printYamlCode(string $content) : string { return $this->printCodeWrapped($content, self::SYNTAX_YAML); } - - private function printCodeWrapped(string $content, string $format): string + private function printCodeWrapped(string $content, string $format) : string { - return sprintf('```%s%s%s%s```', $format, PHP_EOL, rtrim($content), PHP_EOL) . PHP_EOL; + return \sprintf('```%s%s%s%s```', $format, \PHP_EOL, \rtrim($content), \PHP_EOL) . \PHP_EOL; } } diff --git a/src/Printer/Markdown/MarkdownDiffer.php b/src/Printer/Markdown/MarkdownDiffer.php index 6ffad734..afded50e 100644 --- a/src/Printer/Markdown/MarkdownDiffer.php +++ b/src/Printer/Markdown/MarkdownDiffer.php @@ -1,64 +1,57 @@ differ = $differ; } - - public function diff(string $old, string $new): string + public function diff(string $old, string $new) : string { if ($old === $new) { return ''; } - $diff = $this->differ->diff($old, $new); - $diff = $this->clearUnifiedDiffOutputFirstLine($diff); $diff = $this->removeTrailingWhitespaces($diff); - return $this->warpToDiffCode($diff); } - /** * Removes UnifiedDiffOutputBuilder generated pre-spaces " \n" => "\n" */ - private function removeTrailingWhitespaces(string $diff): string + private function removeTrailingWhitespaces(string $diff) : string { - $diff = Strings::replace($diff, self::SPACE_AND_NEWLINE_REGEX, PHP_EOL); - - return rtrim($diff); + $diff = Strings::replace($diff, self::SPACE_AND_NEWLINE_REGEX, \PHP_EOL); + return \rtrim($diff); } - - private function warpToDiffCode(string $content): string + private function warpToDiffCode(string $content) : string { - return '```diff' . PHP_EOL . $content . PHP_EOL . '```' . PHP_EOL; + return '```diff' . \PHP_EOL . $content . \PHP_EOL . '```' . \PHP_EOL; } - - private function clearUnifiedDiffOutputFirstLine(string $diff): string + private function clearUnifiedDiffOutputFirstLine(string $diff) : string { return Strings::replace($diff, self::METADATA_REGEX, ''); } diff --git a/src/Printer/NeonPrinter.php b/src/Printer/NeonPrinter.php index 81424d82..336cf393 100644 --- a/src/Printer/NeonPrinter.php +++ b/src/Printer/NeonPrinter.php @@ -1,30 +1,25 @@ .*?)$#ms'; - + private const TAGS_REGEX = '#tags:\\s+\\-\\s+(?.*?)$#ms'; /** * @param mixed[] $phpStanNeon */ - public function printNeon(array $phpStanNeon): string + public function printNeon(array $phpStanNeon) : string { $printedContent = Yaml::dump($phpStanNeon, 1000); - // inline single tags, dummy $printedContent = Strings::replace($printedContent, self::TAGS_REGEX, 'tags: [$1]'); - - return rtrim($printedContent) . PHP_EOL; + return \rtrim($printedContent) . \PHP_EOL; } } diff --git a/src/Printer/RuleDefinitionsPrinter.php b/src/Printer/RuleDefinitionsPrinter.php index 033bb81f..aa602f08 100644 --- a/src/Printer/RuleDefinitionsPrinter.php +++ b/src/Printer/RuleDefinitionsPrinter.php @@ -1,40 +1,43 @@ codeSamplePrinter = $codeSamplePrinter; + $this->keywordHighlighter = $keywordHighlighter; } - /** * @param RuleDefinition[] $ruleDefinitions * @return string[] */ - public function print(array $ruleDefinitions, ?int $categorizeLevel): array + public function print(array $ruleDefinitions, ?int $categorizeLevel) : array { - $ruleCount = count($ruleDefinitions); - + $ruleCount = \count($ruleDefinitions); $lines = []; - $lines[] = sprintf('# %d Rules Overview', $ruleCount); - + $lines[] = \sprintf('# %d Rules Overview', $ruleCount); if ($categorizeLevel) { $ruleDefinitionsByCategory = $this->groupDefinitionsByCategory($ruleDefinitions, $categorizeLevel); - $categoryMenuLines = $this->createCategoryMenu($ruleDefinitionsByCategory); - $lines = [...$lines, ...$categoryMenuLines]; - + $lines = \array_merge($lines, $categoryMenuLines); foreach ($ruleDefinitionsByCategory as $category => $ruleDefinitions) { $lines[] = '## ' . $category; $lines = $this->printRuleDefinitions($ruleDefinitions, $lines, $categorizeLevel); @@ -42,35 +45,29 @@ public function print(array $ruleDefinitions, ?int $categorizeLevel): array } else { $lines = $this->printRuleDefinitions($ruleDefinitions, $lines, null); } - return $lines; } - /** * @param RuleDefinition[] $ruleDefinitions * @return array */ - private function groupDefinitionsByCategory(array $ruleDefinitions, int $categorizeLevel): array + private function groupDefinitionsByCategory(array $ruleDefinitions, int $categorizeLevel) : array { $ruleDefinitionsByCategory = []; - // have a convention from namespace :) foreach ($ruleDefinitions as $ruleDefinition) { $category = $this->resolveCategory($ruleDefinition, $categorizeLevel); $ruleDefinitionsByCategory[$category][] = $ruleDefinition; } - - ksort($ruleDefinitionsByCategory); - + \ksort($ruleDefinitionsByCategory); return $ruleDefinitionsByCategory; } - /** * @param RuleDefinition[] $ruleDefinitions * @param string[] $lines * @return string[] */ - private function printRuleDefinitions(array $ruleDefinitions, array $lines, ?int $categorizeLevel): array + private function printRuleDefinitions(array $ruleDefinitions, array $lines, ?int $categorizeLevel) : array { foreach ($ruleDefinitions as $ruleDefinition) { if ($categorizeLevel) { @@ -78,60 +75,45 @@ private function printRuleDefinitions(array $ruleDefinitions, array $lines, ?int } else { $lines[] = '## ' . $ruleDefinition->getRuleShortClass(); } - $lines[] = $this->keywordHighlighter->highlight($ruleDefinition->getDescription()); - if ($ruleDefinition->isConfigurable()) { $lines[] = ':wrench: **configure it!**'; } - $lines[] = '- class: [`' . $ruleDefinition->getRuleClass() . '`](' . $ruleDefinition->getRuleFilePath() . ')'; - $codeSampleLines = $this->codeSamplePrinter->print($ruleDefinition); - $lines = array_merge($lines, $codeSampleLines); + $lines = \array_merge($lines, $codeSampleLines); } - return $lines; } - /** * @param array $ruleDefinitionsByCategory * @return string[] */ - private function createCategoryMenu(array $ruleDefinitionsByCategory): array + private function createCategoryMenu(array $ruleDefinitionsByCategory) : array { $lines = []; $lines[] = '
    '; $lines[] = '## Categories'; - foreach ($ruleDefinitionsByCategory as $category => $ruleDefinitions) { - $categoryLink = strtolower(Strings::webalize($category)); - - $lines[] = sprintf('- [%s](#%s) (%d)', $category, $categoryLink, count($ruleDefinitions)); + $categoryLink = \strtolower(Strings::webalize($category)); + $lines[] = \sprintf('- [%s](#%s) (%d)', $category, $categoryLink, \count($ruleDefinitions)); } - $lines[] = '
    '; - return $lines; } - - private function resolveCategory(RuleDefinition $ruleDefinition, int $categorizeLevel): string + private function resolveCategory(RuleDefinition $ruleDefinition, int $categorizeLevel) : string { - $classNameParts = explode('\\', $ruleDefinition->getRuleClass()); - + $classNameParts = \explode('\\', $ruleDefinition->getRuleClass()); // get one namespace before last by convention - array_pop($classNameParts); - + \array_pop($classNameParts); $categoryName = null; while ($categorizeLevel > 0) { // get one namespace before last by convention - $categoryName = array_pop($classNameParts); + $categoryName = \array_pop($classNameParts); --$categorizeLevel; } - // remove _ as not part of title Assert::string($categoryName); - - return trim($categoryName, '_'); + return \trim($categoryName, '_'); } } diff --git a/src/RuleCodeSamplePrinter/ECSRuleCodeSamplePrinter.php b/src/RuleCodeSamplePrinter/ECSRuleCodeSamplePrinter.php index 20300e2f..36fb7778 100644 --- a/src/RuleCodeSamplePrinter/ECSRuleCodeSamplePrinter.php +++ b/src/RuleCodeSamplePrinter/ECSRuleCodeSamplePrinter.php @@ -1,7 +1,6 @@ badGoodCodeSamplePrinter = $badGoodCodeSamplePrinter; + $this->diffCodeSamplePrinter = $diffCodeSamplePrinter; } - - public function isMatch(string $class): bool + public function isMatch(string $class) : bool { - if (str_ends_with($class, 'Fixer')) { - return true; + if (\substr_compare($class, 'Fixer', -\strlen('Fixer')) === 0) { + return \true; } - - return str_ends_with($class, 'Sniff'); + return \substr_compare($class, 'Sniff', -\strlen('Sniff')) === 0; } - /** * @return string[] */ - public function print(CodeSampleInterface $codeSample, RuleDefinition $ruleDefinition): array + public function print(CodeSampleInterface $codeSample, RuleDefinition $ruleDefinition) : array { - if (is_a($ruleDefinition->getRuleClass(), 'PHP_CodeSniffer\Sniffs\Sniff', true)) { + if (\is_a($ruleDefinition->getRuleClass(), 'RuleDocGenerator202403\\PHP_CodeSniffer\\Sniffs\\Sniff', \true)) { return $this->badGoodCodeSamplePrinter->print($codeSample); } - return $this->diffCodeSamplePrinter->print($codeSample); } } diff --git a/src/RuleCodeSamplePrinter/PHPStanRuleCodeSamplePrinter.php b/src/RuleCodeSamplePrinter/PHPStanRuleCodeSamplePrinter.php index 8948abba..a5dea5c4 100644 --- a/src/RuleCodeSamplePrinter/PHPStanRuleCodeSamplePrinter.php +++ b/src/RuleCodeSamplePrinter/PHPStanRuleCodeSamplePrinter.php @@ -1,7 +1,6 @@ neonPrinter = $neonPrinter; + $this->markdownCodeWrapper = $markdownCodeWrapper; + $this->badGoodCodeSamplePrinter = $badGoodCodeSamplePrinter; } - - public function isMatch(string $class): bool + public function isMatch(string $class) : bool { - return is_a($class, 'PHPStan\Rules\Rule', true); + return \is_a($class, 'RuleDocGenerator202403\\PHPStan\\Rules\\Rule', \true); } - /** * @return string[] */ - public function print(CodeSampleInterface $codeSample, RuleDefinition $ruleDefinition): array + public function print(CodeSampleInterface $codeSample, RuleDefinition $ruleDefinition) : array { if ($codeSample instanceof ConfiguredCodeSample) { return $this->printConfigurableCodeSample($codeSample, $ruleDefinition); } - return $this->badGoodCodeSamplePrinter->print($codeSample); } - /** * @return string[] */ - private function printConfigurableCodeSample( - ConfiguredCodeSample $configuredCodeSample, - RuleDefinition $ruleDefinition - ): array { + private function printConfigurableCodeSample(ConfiguredCodeSample $configuredCodeSample, RuleDefinition $ruleDefinition) : array + { $lines = []; - - $phpStanNeon = [ - 'services' => [ - [ - 'class' => $ruleDefinition->getRuleClass(), - 'tags' => ['phpstan.rules.rule'], - 'arguments' => $configuredCodeSample->getConfiguration(), - ], - ], - ]; - + $phpStanNeon = ['services' => [['class' => $ruleDefinition->getRuleClass(), 'tags' => ['phpstan.rules.rule'], 'arguments' => $configuredCodeSample->getConfiguration()]]]; $printedNeon = $this->neonPrinter->printNeon($phpStanNeon); $lines[] = $this->markdownCodeWrapper->printYamlCode($printedNeon); - $lines[] = '↓'; - $newLines = $this->badGoodCodeSamplePrinter->print($configuredCodeSample); - return [...$lines, ...$newLines]; + return \array_merge($lines, $newLines); } } diff --git a/src/RuleCodeSamplePrinter/RectorRuleCodeSamplePrinter.php b/src/RuleCodeSamplePrinter/RectorRuleCodeSamplePrinter.php index 18932f98..db5d5927 100644 --- a/src/RuleCodeSamplePrinter/RectorRuleCodeSamplePrinter.php +++ b/src/RuleCodeSamplePrinter/RectorRuleCodeSamplePrinter.php @@ -1,31 +1,32 @@ diffCodeSamplePrinter = $diffCodeSamplePrinter; } - - public function isMatch(string $class): bool + public function isMatch(string $class) : bool { - return is_a($class, RectorInterface::class, true); + return \is_a($class, RectorInterface::class, \true); } - /** * @return string[] */ - public function print(CodeSampleInterface $codeSample, RuleDefinition $ruleDefinition): array + public function print(CodeSampleInterface $codeSample, RuleDefinition $ruleDefinition) : array { return $this->diffCodeSamplePrinter->print($codeSample); } diff --git a/src/RuleDefinitionsResolver.php b/src/RuleDefinitionsResolver.php index 7575ad54..a6929226 100644 --- a/src/RuleDefinitionsResolver.php +++ b/src/RuleDefinitionsResolver.php @@ -1,7 +1,6 @@ getClass()); - $documentedRule = $reflectionClass->newInstanceWithoutConstructor(); - if (! $documentedRule instanceof DocumentedRuleInterface) { + if (!$documentedRule instanceof DocumentedRuleInterface) { throw new ShouldNotHappenException(); } - $ruleDefinition = $documentedRule->getRuleDefinition(); $ruleDefinition->setRuleClass($ruleClassWithFilePath->getClass()); - $ruleDefinition->setRuleFilePath($ruleClassWithFilePath->getPath()); - $ruleDefinitions[] = $ruleDefinition; } - return $this->sortByClassName($ruleDefinitions); } - /** * @param RuleDefinition[] $ruleDefinitions * @return RuleDefinition[] */ - private function sortByClassName(array $ruleDefinitions): array + private function sortByClassName(array $ruleDefinitions) : array { - usort( - $ruleDefinitions, - static fn (RuleDefinition $firstRuleDefinition, RuleDefinition $secondRuleDefinition): int => $firstRuleDefinition->getRuleShortClass() <=> $secondRuleDefinition->getRuleShortClass() - ); - + \usort($ruleDefinitions, static function (RuleDefinition $firstRuleDefinition, RuleDefinition $secondRuleDefinition) : int { + return $firstRuleDefinition->getRuleShortClass() <=> $secondRuleDefinition->getRuleShortClass(); + }); return $ruleDefinitions; } } diff --git a/src/Text/KeywordHighlighter.php b/src/Text/KeywordHighlighter.php index a4f79f69..ae6a6c30 100644 --- a/src/Text/KeywordHighlighter.php +++ b/src/Text/KeywordHighlighter.php @@ -1,12 +1,10 @@ ]+)[^\]](\(\))?#'; - + private const VARIABLE_CALL_OR_VARIABLE_REGEX = '#^\\$([A-Za-z\\-\\>]+)[^\\]](\\(\\))?#'; /** * @var string * @see https://regex101.com/r/uxtJDA/1 */ - private const STATIC_CALL_REGEX = '#([A-Za-z::\-\>]+)(\(\))$#'; - + private const STATIC_CALL_REGEX = '#([A-Za-z::\\-\\>]+)(\\(\\))$#'; /** * @var string * @see https://regex101.com/r/9vnLcf/1 */ - private const ANNOTATION_REGEX = '#(\@\w+)$#'; - + private const ANNOTATION_REGEX = '#(\\@\\w+)$#'; /** * @var string * @see https://regex101.com/r/bwUIKb/1 */ - private const METHOD_NAME_REGEX = '#\w+\(\)#'; - + private const METHOD_NAME_REGEX = '#\\w+\\(\\)#'; /** * @var string * @see https://regex101.com/r/18wjck/2 */ - private const COMMA_SPLIT_REGEX = '#(?\w+\(.*\))(\s{0,})(?,)(?\`)#'; - - public function highlight(string $content): string + private const COMMA_SPLIT_REGEX = '#(?\\w+\\(.*\\))(\\s{0,})(?,)(?\\`)#'; + public function highlight(string $content) : string { $words = Strings::split($content, '# #'); foreach ($words as $key => $word) { - if (! $this->isKeywordToHighlight($word)) { + if (!$this->isKeywordToHighlight($word)) { continue; } - - $words[$key] = Strings::replace( - '`' . $word . '`', - self::COMMA_SPLIT_REGEX, - static fn (array $match): string => $match['call'] . $match['quote'] . $match['comma'] - ); + $words[$key] = Strings::replace('`' . $word . '`', self::COMMA_SPLIT_REGEX, static function (array $match) : string { + return $match['call'] . $match['quote'] . $match['comma']; + }); } - - return implode(' ', $words); + return \implode(' ', $words); } - - private function isKeywordToHighlight(string $word): bool + private function isKeywordToHighlight(string $word) : bool { if (Strings::match($word, self::ANNOTATION_REGEX)) { - return true; + return \true; } - // already in code quotes - if (\str_starts_with($word, '`')) { - return false; + if (\strncmp($word, '`', \strlen('`')) === 0) { + return \false; } - - if (\str_ends_with($word, '`')) { - return false; + if (\substr_compare($word, '`', -\strlen('`')) === 0) { + return \false; } - // part of normal text - if (in_array($word, self::TEXT_WORDS, true)) { - return false; + if (\in_array($word, self::TEXT_WORDS, \true)) { + return \false; } - if ($this->isFunctionOrClass($word)) { - return true; + return \true; } - if ($word === 'composer.json') { - return true; + return \true; } - if ((bool) Strings::match($word, self::VARIABLE_CALL_OR_VARIABLE_REGEX)) { - return true; + return \true; } - return (bool) Strings::match($word, self::STATIC_CALL_REGEX); } - - private function isFunctionOrClass(string $word): bool + private function isFunctionOrClass(string $word) : bool { if (Strings::match($word, self::METHOD_NAME_REGEX)) { - return true; + return \true; } - if ($this->doesClassLikeExist($word)) { // not a className - if (! \str_contains($word, '\\')) { - return in_array($word, [Throwable::class, 'Exception'], true); + if (\strpos($word, '\\') === \false) { + return \in_array($word, [Throwable::class, 'Exception'], \true); } - - return true; + return \true; } - - return false; + return \false; } - - private function doesClassLikeExist(string $className): bool + private function doesClassLikeExist(string $className) : bool { - if (class_exists($className)) { - return true; + if (\class_exists($className)) { + return \true; } - - if (interface_exists($className)) { - return true; + if (\interface_exists($className)) { + return \true; } - - return trait_exists($className); + return \trait_exists($className); } } diff --git a/src/ValueObject/Option.php b/src/ValueObject/Option.php index 99cf1340..8fc16e3b 100644 --- a/src/ValueObject/Option.php +++ b/src/ValueObject/Option.php @@ -1,7 +1,6 @@ class = $class; + $this->path = $path; } - - public function getClass(): string + public function getClass() : string { return $this->class; } - - public function getPath(): string + public function getPath() : string { return $this->path; } diff --git a/tests/AbstractTestCase.php b/tests/AbstractTestCase.php deleted file mode 100644 index f849d378..00000000 --- a/tests/AbstractTestCase.php +++ /dev/null @@ -1,28 +0,0 @@ - $type - * @return TType - */ - protected function make(string $type): object - { - $containerFactory = new ContainerFactory(); - $container = $containerFactory->create(); - - $service = $container->make($type); - Assert::isInstanceOf($service, $type); - - return $service; - } -} diff --git a/tests/DirectoryToMarkdownPrinter/DirectoryToMarkdownPrinterTest.php b/tests/DirectoryToMarkdownPrinter/DirectoryToMarkdownPrinterTest.php deleted file mode 100644 index 163aecdb..00000000 --- a/tests/DirectoryToMarkdownPrinter/DirectoryToMarkdownPrinterTest.php +++ /dev/null @@ -1,47 +0,0 @@ -directoryToMarkdownPrinter = $this->make(DirectoryToMarkdownPrinter::class); - } - - #[DataProvider('provideData')] - public function test(string $directory, string $expectedFile, ?int $categorizeLevel = null): void - { - $fileContent = $this->directoryToMarkdownPrinter->print(__DIR__, [$directory], $categorizeLevel, []); - - StaticFixtureUpdater::updateExpectedFixtureContent($fileContent, $expectedFile); - - $this->assertStringEqualsFile($expectedFile, $fileContent, $directory); - } - - public static function provideData(): Iterator - { - yield [__DIR__ . '/Fixture/PHPStan/Standard', __DIR__ . '/Expected/phpstan/phpstan_content.md']; - - yield [ - __DIR__ . '/Fixture/PHPStan/Configurable', - __DIR__ . '/Expected/phpstan/configurable_phpstan_content.md', - ]; - - yield [__DIR__ . '/Fixture/PHPCSFixer/Standard', __DIR__ . '/Expected/php-cs-fixer/phpcsfixer_content.md']; - - yield [__DIR__ . '/Fixture/Rector/Standard', __DIR__ . '/Expected/rector/rector_content.md']; - - yield [__DIR__ . '/Fixture/Rector/Standard', __DIR__ . '/Expected/rector/rector_categorized.md', 1]; - } -} diff --git a/tests/DirectoryToMarkdownPrinter/Expected/php-cs-fixer/phpcsfixer_content.md b/tests/DirectoryToMarkdownPrinter/Expected/php-cs-fixer/phpcsfixer_content.md deleted file mode 100644 index d136ef23..00000000 --- a/tests/DirectoryToMarkdownPrinter/Expected/php-cs-fixer/phpcsfixer_content.md +++ /dev/null @@ -1,14 +0,0 @@ -# 1 Rules Overview - -## SomeFixer - -Some description - -- class: [`Symplify\RuleDocGenerator\Tests\DirectoryToMarkdownPrinter\Fixture\PHPCSFixer\Standard\SomeFixer`](Fixture/PHPCSFixer/Standard/SomeFixer.php) - -```diff --bad code -+good code -``` - -
    diff --git a/tests/DirectoryToMarkdownPrinter/Expected/phpstan/configurable_phpstan_content.md b/tests/DirectoryToMarkdownPrinter/Expected/phpstan/configurable_phpstan_content.md deleted file mode 100644 index f9a7a256..00000000 --- a/tests/DirectoryToMarkdownPrinter/Expected/phpstan/configurable_phpstan_content.md +++ /dev/null @@ -1,36 +0,0 @@ -# 1 Rules Overview - -## SomePHPStanRule - -Some description - -:wrench: **configure it!** - -- class: [`Symplify\RuleDocGenerator\Tests\DirectoryToMarkdownPrinter\Fixture\PHPStan\Configurable\SomePHPStanRule`](Fixture/PHPStan/Configurable/SomePHPStanRule.php) - -```yaml -services: - - - class: Symplify\RuleDocGenerator\Tests\DirectoryToMarkdownPrinter\Fixture\PHPStan\Configurable\SomePHPStanRule - tags: [phpstan.rules.rule] - arguments: - someValue: 10 -``` - -↓ - -```php -bad code -``` - -:x: - -
    - -```php -good code -``` - -:+1: - -
    diff --git a/tests/DirectoryToMarkdownPrinter/Expected/phpstan/phpstan_content.md b/tests/DirectoryToMarkdownPrinter/Expected/phpstan/phpstan_content.md deleted file mode 100644 index c283eb66..00000000 --- a/tests/DirectoryToMarkdownPrinter/Expected/phpstan/phpstan_content.md +++ /dev/null @@ -1,23 +0,0 @@ -# 1 Rules Overview - -## SomePHPStanRule - -Some description - -- class: [`Symplify\RuleDocGenerator\Tests\DirectoryToMarkdownPrinter\Fixture\PHPStan\Standard\SomePHPStanRule`](Fixture/PHPStan/Standard/SomePHPStanRule.php) - -```php -bad code -``` - -:x: - -
    - -```php -good code -``` - -:+1: - -
    diff --git a/tests/DirectoryToMarkdownPrinter/Expected/rector/composer_json_aware_rector_content.md b/tests/DirectoryToMarkdownPrinter/Expected/rector/composer_json_aware_rector_content.md deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/DirectoryToMarkdownPrinter/Expected/rector/configurable_rector_content.md b/tests/DirectoryToMarkdownPrinter/Expected/rector/configurable_rector_content.md deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/DirectoryToMarkdownPrinter/Expected/rector/rector_categorized.md b/tests/DirectoryToMarkdownPrinter/Expected/rector/rector_categorized.md deleted file mode 100644 index 2c5600f6..00000000 --- a/tests/DirectoryToMarkdownPrinter/Expected/rector/rector_categorized.md +++ /dev/null @@ -1,37 +0,0 @@ -# 2 Rules Overview - -
    - -## Categories - -- [Standard](#standard) (2) - -
    - -## Standard - -### SomeRector - -Some change - -- class: [`Symplify\RuleDocGenerator\Tests\DirectoryToMarkdownPrinter\Fixture\Rector\Standard\SomeRector`](Fixture/Rector/Standard/SomeRector.php) - -```diff --before -+after -``` - -
    - -### SomeWhiteSpaceCodeSampleRector - -Some change - -- class: [`Symplify\RuleDocGenerator\Tests\DirectoryToMarkdownPrinter\Fixture\Rector\Standard\SomeWhiteSpaceCodeSampleRector`](Fixture/Rector/Standard/SomeWhiteSpaceCodeSampleRector.php) - -```diff --before -+after -``` - -
    diff --git a/tests/DirectoryToMarkdownPrinter/Expected/rector/rector_content.md b/tests/DirectoryToMarkdownPrinter/Expected/rector/rector_content.md deleted file mode 100644 index 6061a1e4..00000000 --- a/tests/DirectoryToMarkdownPrinter/Expected/rector/rector_content.md +++ /dev/null @@ -1,27 +0,0 @@ -# 2 Rules Overview - -## SomeRector - -Some change - -- class: [`Symplify\RuleDocGenerator\Tests\DirectoryToMarkdownPrinter\Fixture\Rector\Standard\SomeRector`](Fixture/Rector/Standard/SomeRector.php) - -```diff --before -+after -``` - -
    - -## SomeWhiteSpaceCodeSampleRector - -Some change - -- class: [`Symplify\RuleDocGenerator\Tests\DirectoryToMarkdownPrinter\Fixture\Rector\Standard\SomeWhiteSpaceCodeSampleRector`](Fixture/Rector/Standard/SomeWhiteSpaceCodeSampleRector.php) - -```diff --before -+after -``` - -
    diff --git a/tests/DirectoryToMarkdownPrinter/Fixture/PHPCSFixer/Standard/SomeFixer.php b/tests/DirectoryToMarkdownPrinter/Fixture/PHPCSFixer/Standard/SomeFixer.php deleted file mode 100644 index d14edae5..00000000 --- a/tests/DirectoryToMarkdownPrinter/Fixture/PHPCSFixer/Standard/SomeFixer.php +++ /dev/null @@ -1,42 +0,0 @@ -someValue = $someValue; - } - - public function getRuleDefinition(): RuleDefinition - { - return new RuleDefinition('Some description', [ - new ConfiguredCodeSample( - <<<'CODE_SAMPLE' -bad code -CODE_SAMPLE - , - <<<'CODE_SAMPLE' -good code -CODE_SAMPLE - , - [ - 'someValue' => 10, - ] - ), - ]); - } - - public function getNodeType(): string - { - } - - public function processNode(\PhpParser\Node $node, \PHPStan\Analyser\Scope $scope): array - { - } -} diff --git a/tests/DirectoryToMarkdownPrinter/Fixture/PHPStan/Standard/SomePHPStanRule.php b/tests/DirectoryToMarkdownPrinter/Fixture/PHPStan/Standard/SomePHPStanRule.php deleted file mode 100644 index b5df72ae..00000000 --- a/tests/DirectoryToMarkdownPrinter/Fixture/PHPStan/Standard/SomePHPStanRule.php +++ /dev/null @@ -1,36 +0,0 @@ - 'value', - 'second_key' => 'second_value', - ]] - ), - ]); - } -} diff --git a/tests/DirectoryToMarkdownPrinter/Fixture/Rector/Configurable/DirectConfiguredStringKeyRector.php b/tests/DirectoryToMarkdownPrinter/Fixture/Rector/Configurable/DirectConfiguredStringKeyRector.php deleted file mode 100644 index 6fffc4e5..00000000 --- a/tests/DirectoryToMarkdownPrinter/Fixture/Rector/Configurable/DirectConfiguredStringKeyRector.php +++ /dev/null @@ -1,32 +0,0 @@ - 'Laravel\\Templating\\render', - 'redirect' => 'Some\\Redirector\\redirect', - ] - ), - ]); - } -} diff --git a/tests/DirectoryToMarkdownPrinter/Fixture/Rector/Configurable/WithPHPStanTypeObject.php b/tests/DirectoryToMarkdownPrinter/Fixture/Rector/Configurable/WithPHPStanTypeObject.php deleted file mode 100644 index e4e25353..00000000 --- a/tests/DirectoryToMarkdownPrinter/Fixture/Rector/Configurable/WithPHPStanTypeObject.php +++ /dev/null @@ -1,43 +0,0 @@ -make(MarkdownDiffer::class); - - $currentDiff = $markdownDiffer->diff('old code', 'new code'); - $this->assertStringEqualsFile(__DIR__ . '/Fixture/expected_diff.txt', $currentDiff); - } -} diff --git a/tests/Text/KeywordHighlighterTest.php b/tests/Text/KeywordHighlighterTest.php deleted file mode 100644 index c59659cf..00000000 --- a/tests/Text/KeywordHighlighterTest.php +++ /dev/null @@ -1,42 +0,0 @@ -keywordHighlighter = $this->make(KeywordHighlighter::class); - } - - #[DataProvider('provideData')] - public function test(string $inputText, string $expectedHighlightedText): void - { - $highlightedText = $this->keywordHighlighter->highlight($inputText); - $this->assertSame($expectedHighlightedText, $highlightedText); - } - - public static function provideData(): Iterator - { - yield ['some @var text', 'some `@var` text']; - yield ['@param @var text', '`@param` `@var` text']; - yield ['some @var and @param text', 'some `@var` and `@param` text']; - yield [ - 'Split multiple inline assigns to each own lines default value, to prevent undefined array issues', - 'Split multiple inline assigns to each own lines default value, to prevent undefined array issues', - ]; - yield [ - 'autowire(), autoconfigure(), and public() are required in config service', - '`autowire()`, `autoconfigure()`, and `public()` are required in config service', - ]; - } -} diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 00000000..f368dc90 --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,25 @@ +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', 'RuleDocGenerator202403\\Composer\\BinProxyWrapper')) { + return include "phpvfscomposer://" . __DIR__ . '/..' . '/symfony/yaml/Resources/bin/yaml-lint'; + } +} +return include __DIR__ . '/..' . '/symfony/yaml/Resources/bin/yaml-lint'; diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php new file mode 100644 index 00000000..7824d8f7 --- /dev/null +++ b/vendor/composer/ClassLoader.php @@ -0,0 +1,579 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> + */ + private $prefixesPsr0 = array(); + /** + * @var list + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php new file mode 100644 index 00000000..effc33ac --- /dev/null +++ b/vendor/composer/InstalledVersions.php @@ -0,0 +1,313 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Composer; + +use RuleDocGenerator202403\Composer\Autoload\ClassLoader; +use RuleDocGenerator202403\Composer\Semver\VersionParser; +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + /** + * @var bool|null + */ + private static $canGetVendors; + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = \array_keys($installed['versions']); + } + if (1 === \count($packages)) { + return $packages[0]; + } + return \array_keys(\array_flip(\call_user_func_array('RuleDocGenerator202403\\array_merge', $packages))); + } + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + return $packagesByType; + } + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = \true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === \false; + } + } + return \false; + } + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + return $provided->matches($constraint); + } + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (\array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = \array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (\array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = \array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (\array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = \array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + return \implode(' || ', $ranges); + } + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + return $installed['versions'][$packageName]['version']; + } + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + return $installed['versions'][$packageName]['pretty_version']; + } + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + return $installed['versions'][$packageName]['reference']; + } + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + return $installed[0]['root']; + } + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @\trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', \E_USER_DEPRECATED); + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (\substr(__DIR__, -8, 1) !== 'C') { + self::$installed = (include __DIR__ . '/installed.php'); + } else { + self::$installed = array(); + } + } + return self::$installed; + } + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = \method_exists('RuleDocGenerator202403\\Composer\\Autoload\\ClassLoader', 'getRegisteredLoaders'); + } + $installed = array(); + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (\is_file($vendorDir . '/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = (require $vendorDir . '/composer/installed.php'); + $installed[] = self::$installedByVendor[$vendorDir] = $required; + if (null === self::$installed && \strtr($vendorDir . '/composer', '\\', '/') === \strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[\count($installed) - 1]; + } + } + } + } + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (\substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = (require __DIR__ . '/installed.php'); + self::$installed = $required; + } else { + self::$installed = array(); + } + } + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + return $installed; + } +} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE new file mode 100644 index 00000000..f27399a0 --- /dev/null +++ b/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +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/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php new file mode 100644 index 00000000..2aa67a8b --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,421 @@ + $vendorDir . '/composer/InstalledVersions.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\BoundMethod' => $vendorDir . '/illuminate/container/BoundMethod.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\Container' => $vendorDir . '/illuminate/container/Container.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/container/ContextualBindingBuilder.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\EntryNotFoundException' => $vendorDir . '/illuminate/container/EntryNotFoundException.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\RewindableGenerator' => $vendorDir . '/illuminate/container/RewindableGenerator.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\Util' => $vendorDir . '/illuminate/container/Util.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Access\\Authorizable' => $vendorDir . '/illuminate/contracts/Auth/Access/Authorizable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Access\\Gate' => $vendorDir . '/illuminate/contracts/Auth/Access/Gate.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Authenticatable' => $vendorDir . '/illuminate/contracts/Auth/Authenticatable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\CanResetPassword' => $vendorDir . '/illuminate/contracts/Auth/CanResetPassword.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Factory' => $vendorDir . '/illuminate/contracts/Auth/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Guard' => $vendorDir . '/illuminate/contracts/Auth/Guard.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => $vendorDir . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\MustVerifyEmail' => $vendorDir . '/illuminate/contracts/Auth/MustVerifyEmail.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\PasswordBroker' => $vendorDir . '/illuminate/contracts/Auth/PasswordBroker.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => $vendorDir . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\StatefulGuard' => $vendorDir . '/illuminate/contracts/Auth/StatefulGuard.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => $vendorDir . '/illuminate/contracts/Auth/SupportsBasicAuth.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\UserProvider' => $vendorDir . '/illuminate/contracts/Auth/UserProvider.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\Broadcaster' => $vendorDir . '/illuminate/contracts/Broadcasting/Broadcaster.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\Factory' => $vendorDir . '/illuminate/contracts/Broadcasting/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => $vendorDir . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => $vendorDir . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Bus\\Dispatcher' => $vendorDir . '/illuminate/contracts/Bus/Dispatcher.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Bus\\QueueingDispatcher' => $vendorDir . '/illuminate/contracts/Bus/QueueingDispatcher.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\Factory' => $vendorDir . '/illuminate/contracts/Cache/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\Lock' => $vendorDir . '/illuminate/contracts/Cache/Lock.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\LockProvider' => $vendorDir . '/illuminate/contracts/Cache/LockProvider.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Cache/LockTimeoutException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\Repository' => $vendorDir . '/illuminate/contracts/Cache/Repository.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\Store' => $vendorDir . '/illuminate/contracts/Cache/Store.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Config\\Repository' => $vendorDir . '/illuminate/contracts/Config/Repository.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Console\\Application' => $vendorDir . '/illuminate/contracts/Console/Application.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Console\\Isolatable' => $vendorDir . '/illuminate/contracts/Console/Isolatable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Console\\Kernel' => $vendorDir . '/illuminate/contracts/Console/Kernel.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Console\\PromptsForMissingInput' => $vendorDir . '/illuminate/contracts/Console/PromptsForMissingInput.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Container\\BindingResolutionException' => $vendorDir . '/illuminate/contracts/Container/BindingResolutionException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Container\\CircularDependencyException' => $vendorDir . '/illuminate/contracts/Container/CircularDependencyException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Container\\Container' => $vendorDir . '/illuminate/contracts/Container/Container.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => $vendorDir . '/illuminate/contracts/Container/ContextualBindingBuilder.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cookie\\Factory' => $vendorDir . '/illuminate/contracts/Cookie/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cookie\\QueueingFactory' => $vendorDir . '/illuminate/contracts/Cookie/QueueingFactory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\Builder' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Builder.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\Castable' => $vendorDir . '/illuminate/contracts/Database/Eloquent/Castable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => $vendorDir . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => $vendorDir . '/illuminate/contracts/Database/Events/MigrationEvent.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\ModelIdentifier' => $vendorDir . '/illuminate/contracts/Database/ModelIdentifier.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Query\\Builder' => $vendorDir . '/illuminate/contracts/Database/Query/Builder.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => $vendorDir . '/illuminate/contracts/Database/Query/ConditionExpression.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Query\\Expression' => $vendorDir . '/illuminate/contracts/Database/Query/Expression.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Debug\\ExceptionHandler' => $vendorDir . '/illuminate/contracts/Debug/ExceptionHandler.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Encryption\\DecryptException' => $vendorDir . '/illuminate/contracts/Encryption/DecryptException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Encryption\\EncryptException' => $vendorDir . '/illuminate/contracts/Encryption/EncryptException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Encryption\\Encrypter' => $vendorDir . '/illuminate/contracts/Encryption/Encrypter.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Encryption\\StringEncrypter' => $vendorDir . '/illuminate/contracts/Encryption/StringEncrypter.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Events\\Dispatcher' => $vendorDir . '/illuminate/contracts/Events/Dispatcher.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => $vendorDir . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Filesystem\\Cloud' => $vendorDir . '/illuminate/contracts/Filesystem/Cloud.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Filesystem\\Factory' => $vendorDir . '/illuminate/contracts/Filesystem/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => $vendorDir . '/illuminate/contracts/Filesystem/FileNotFoundException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Filesystem\\Filesystem' => $vendorDir . '/illuminate/contracts/Filesystem/Filesystem.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => $vendorDir . '/illuminate/contracts/Filesystem/LockTimeoutException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Foundation\\Application' => $vendorDir . '/illuminate/contracts/Foundation/Application.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Foundation\\CachesConfiguration' => $vendorDir . '/illuminate/contracts/Foundation/CachesConfiguration.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Foundation\\CachesRoutes' => $vendorDir . '/illuminate/contracts/Foundation/CachesRoutes.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => $vendorDir . '/illuminate/contracts/Foundation/ExceptionRenderer.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Foundation\\MaintenanceMode' => $vendorDir . '/illuminate/contracts/Foundation/MaintenanceMode.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Hashing\\Hasher' => $vendorDir . '/illuminate/contracts/Hashing/Hasher.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Http\\Kernel' => $vendorDir . '/illuminate/contracts/Http/Kernel.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Mail\\Attachable' => $vendorDir . '/illuminate/contracts/Mail/Attachable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Mail\\Factory' => $vendorDir . '/illuminate/contracts/Mail/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Mail\\MailQueue' => $vendorDir . '/illuminate/contracts/Mail/MailQueue.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Mail\\Mailable' => $vendorDir . '/illuminate/contracts/Mail/Mailable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Mail\\Mailer' => $vendorDir . '/illuminate/contracts/Mail/Mailer.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Notifications\\Dispatcher' => $vendorDir . '/illuminate/contracts/Notifications/Dispatcher.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Notifications\\Factory' => $vendorDir . '/illuminate/contracts/Notifications/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Pagination\\CursorPaginator' => $vendorDir . '/illuminate/contracts/Pagination/CursorPaginator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => $vendorDir . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Pagination\\Paginator' => $vendorDir . '/illuminate/contracts/Pagination/Paginator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Pipeline\\Hub' => $vendorDir . '/illuminate/contracts/Pipeline/Hub.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Pipeline\\Pipeline' => $vendorDir . '/illuminate/contracts/Pipeline/Pipeline.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Process\\InvokedProcess' => $vendorDir . '/illuminate/contracts/Process/InvokedProcess.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Process\\ProcessResult' => $vendorDir . '/illuminate/contracts/Process/ProcessResult.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ClearableQueue' => $vendorDir . '/illuminate/contracts/Queue/ClearableQueue.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\EntityNotFoundException' => $vendorDir . '/illuminate/contracts/Queue/EntityNotFoundException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\EntityResolver' => $vendorDir . '/illuminate/contracts/Queue/EntityResolver.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\Factory' => $vendorDir . '/illuminate/contracts/Queue/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\Job' => $vendorDir . '/illuminate/contracts/Queue/Job.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\Monitor' => $vendorDir . '/illuminate/contracts/Queue/Monitor.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\Queue' => $vendorDir . '/illuminate/contracts/Queue/Queue.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\QueueableCollection' => $vendorDir . '/illuminate/contracts/Queue/QueueableCollection.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\QueueableEntity' => $vendorDir . '/illuminate/contracts/Queue/QueueableEntity.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ShouldBeUnique' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUnique.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => $vendorDir . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ShouldQueue' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueue.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => $vendorDir . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Redis\\Connection' => $vendorDir . '/illuminate/contracts/Redis/Connection.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Redis\\Connector' => $vendorDir . '/illuminate/contracts/Redis/Connector.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Redis\\Factory' => $vendorDir . '/illuminate/contracts/Redis/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => $vendorDir . '/illuminate/contracts/Redis/LimiterTimeoutException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Routing\\BindingRegistrar' => $vendorDir . '/illuminate/contracts/Routing/BindingRegistrar.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Routing\\Registrar' => $vendorDir . '/illuminate/contracts/Routing/Registrar.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Routing\\ResponseFactory' => $vendorDir . '/illuminate/contracts/Routing/ResponseFactory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Routing\\UrlGenerator' => $vendorDir . '/illuminate/contracts/Routing/UrlGenerator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Routing\\UrlRoutable' => $vendorDir . '/illuminate/contracts/Routing/UrlRoutable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => $vendorDir . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Session\\Session' => $vendorDir . '/illuminate/contracts/Session/Session.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\Arrayable' => $vendorDir . '/illuminate/contracts/Support/Arrayable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => $vendorDir . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\DeferrableProvider' => $vendorDir . '/illuminate/contracts/Support/DeferrableProvider.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => $vendorDir . '/illuminate/contracts/Support/DeferringDisplayableValue.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\Htmlable' => $vendorDir . '/illuminate/contracts/Support/Htmlable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\Jsonable' => $vendorDir . '/illuminate/contracts/Support/Jsonable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\MessageBag' => $vendorDir . '/illuminate/contracts/Support/MessageBag.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\MessageProvider' => $vendorDir . '/illuminate/contracts/Support/MessageProvider.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\Renderable' => $vendorDir . '/illuminate/contracts/Support/Renderable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\Responsable' => $vendorDir . '/illuminate/contracts/Support/Responsable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\ValidatedData' => $vendorDir . '/illuminate/contracts/Support/ValidatedData.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Translation\\HasLocalePreference' => $vendorDir . '/illuminate/contracts/Translation/HasLocalePreference.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Translation\\Loader' => $vendorDir . '/illuminate/contracts/Translation/Loader.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Translation\\Translator' => $vendorDir . '/illuminate/contracts/Translation/Translator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\DataAwareRule' => $vendorDir . '/illuminate/contracts/Validation/DataAwareRule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\Factory' => $vendorDir . '/illuminate/contracts/Validation/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\ImplicitRule' => $vendorDir . '/illuminate/contracts/Validation/ImplicitRule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\InvokableRule' => $vendorDir . '/illuminate/contracts/Validation/InvokableRule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\Rule' => $vendorDir . '/illuminate/contracts/Validation/Rule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => $vendorDir . '/illuminate/contracts/Validation/UncompromisedVerifier.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => $vendorDir . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\ValidationRule' => $vendorDir . '/illuminate/contracts/Validation/ValidationRule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\Validator' => $vendorDir . '/illuminate/contracts/Validation/Validator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => $vendorDir . '/illuminate/contracts/Validation/ValidatorAwareRule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\View\\Engine' => $vendorDir . '/illuminate/contracts/View/Engine.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\View\\Factory' => $vendorDir . '/illuminate/contracts/View/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\View\\View' => $vendorDir . '/illuminate/contracts/View/View.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\View\\ViewCompilationException' => $vendorDir . '/illuminate/contracts/View/ViewCompilationException.php', + 'RuleDocGenerator202403\\Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\HtmlStringable' => $vendorDir . '/nette/utils/src/HtmlStringable.php', + 'RuleDocGenerator202403\\Nette\\IOException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php', + 'RuleDocGenerator202403\\Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php', + 'RuleDocGenerator202403\\Nette\\Loaders\\RobotLoader' => $vendorDir . '/nette/robot-loader/src/RobotLoader/RobotLoader.php', + 'RuleDocGenerator202403\\Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/compatibility.php', + 'RuleDocGenerator202403\\Nette\\Localization\\Translator' => $vendorDir . '/nette/utils/src/Translator.php', + 'RuleDocGenerator202403\\Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\SmartObject' => $vendorDir . '/nette/utils/src/SmartObject.php', + 'RuleDocGenerator202403\\Nette\\StaticClass' => $vendorDir . '/nette/utils/src/StaticClass.php', + 'RuleDocGenerator202403\\Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php', + 'RuleDocGenerator202403\\Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php', + 'RuleDocGenerator202403\\Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php', + 'RuleDocGenerator202403\\Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php', + 'RuleDocGenerator202403\\Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Finder' => $vendorDir . '/nette/finder/src/Utils/Finder.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Floats' => $vendorDir . '/nette/utils/src/Utils/Floats.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Helpers' => $vendorDir . '/nette/utils/src/Utils/Helpers.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php', + 'RuleDocGenerator202403\\Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/compatibility.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php', + 'RuleDocGenerator202403\\Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php', + 'RuleDocGenerator202403\\Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php', + 'RuleDocGenerator202403\\Nette\\Utils\\ObjectMixin' => $vendorDir . '/nette/utils/src/Utils/ObjectMixin.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php', + 'RuleDocGenerator202403\\Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php', + 'RuleDocGenerator202403\\Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php', + 'RuleDocGenerator202403\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', + 'RuleDocGenerator202403\\Psr\\Container\\ContainerExceptionInterface' => $vendorDir . '/psr/container/src/ContainerExceptionInterface.php', + 'RuleDocGenerator202403\\Psr\\Container\\ContainerInterface' => $vendorDir . '/psr/container/src/ContainerInterface.php', + 'RuleDocGenerator202403\\Psr\\Container\\NotFoundExceptionInterface' => $vendorDir . '/psr/container/src/NotFoundExceptionInterface.php', + 'RuleDocGenerator202403\\Psr\\SimpleCache\\CacheException' => $vendorDir . '/psr/simple-cache/src/CacheException.php', + 'RuleDocGenerator202403\\Psr\\SimpleCache\\CacheInterface' => $vendorDir . '/psr/simple-cache/src/CacheInterface.php', + 'RuleDocGenerator202403\\Psr\\SimpleCache\\InvalidArgumentException' => $vendorDir . '/psr/simple-cache/src/InvalidArgumentException.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\ConfigurationException' => $vendorDir . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Exception' => $vendorDir . '/sebastian/diff/src/Exception/Exception.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\InvalidArgumentException' => $vendorDir . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => $vendorDir . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => $vendorDir . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => $vendorDir . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Application.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Attribute\\AsCommand' => $vendorDir . '/symfony/console/Attribute/AsCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => $vendorDir . '/symfony/console/CI/GithubActionReporter.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Color' => $vendorDir . '/symfony/console/Color.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => $vendorDir . '/symfony/console/CommandLoader/CommandLoaderInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/ContainerCommandLoader.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => $vendorDir . '/symfony/console/CommandLoader/FactoryCommandLoader.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Command/Command.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\CompleteCommand' => $vendorDir . '/symfony/console/Command/CompleteCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => $vendorDir . '/symfony/console/Command/DumpCompletionCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Command/HelpCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\LazyCommand' => $vendorDir . '/symfony/console/Command/LazyCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Command/ListCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\LockableTrait' => $vendorDir . '/symfony/console/Command/LockableTrait.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => $vendorDir . '/symfony/console/Command/SignalableCommandInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\TraceableCommand' => $vendorDir . '/symfony/console/Command/TraceableCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\CompletionInput' => $vendorDir . '/symfony/console/Completion/CompletionInput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => $vendorDir . '/symfony/console/Completion/CompletionSuggestions.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/BashCompletionOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => $vendorDir . '/symfony/console/Completion/Output/CompletionOutputInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/FishCompletionOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => $vendorDir . '/symfony/console/Completion/Output/ZshCompletionOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\Suggestion' => $vendorDir . '/symfony/console/Completion/Suggestion.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/ConsoleEvents.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Cursor' => $vendorDir . '/symfony/console/Cursor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => $vendorDir . '/symfony/console/DataCollector/CommandDataCollector.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Debug\\CliRequest' => $vendorDir . '/symfony/console/Debug/CliRequest.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => $vendorDir . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Descriptor/ApplicationDescription.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Descriptor/Descriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Descriptor/DescriptorInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Descriptor/JsonDescriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Descriptor/MarkdownDescriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => $vendorDir . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Descriptor/TextDescriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Descriptor/XmlDescriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\EventListener\\ErrorListener' => $vendorDir . '/symfony/console/EventListener/ErrorListener.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Event/ConsoleCommandEvent.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => $vendorDir . '/symfony/console/Event/ConsoleErrorEvent.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Event/ConsoleEvent.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => $vendorDir . '/symfony/console/Event/ConsoleSignalEvent.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Event/ConsoleTerminateEvent.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => $vendorDir . '/symfony/console/Exception/CommandNotFoundException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/console/Exception/ExceptionInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/console/Exception/InvalidArgumentException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => $vendorDir . '/symfony/console/Exception/InvalidOptionException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\LogicException' => $vendorDir . '/symfony/console/Exception/LogicException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\MissingInputException' => $vendorDir . '/symfony/console/Exception/MissingInputException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => $vendorDir . '/symfony/console/Exception/NamespaceNotFoundException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => $vendorDir . '/symfony/console/Exception/RunCommandFailedException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\RuntimeException' => $vendorDir . '/symfony/console/Exception/RuntimeException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatter.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/NullOutputFormatterStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Formatter/OutputFormatter.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Formatter/OutputFormatterStyleStack.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => $vendorDir . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => $vendorDir . '/symfony/console/Helper/DebugFormatterHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Helper/DescriptorHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\Dumper' => $vendorDir . '/symfony/console/Helper/Dumper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Helper/FormatterHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Helper/Helper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Helper/HelperInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Helper/HelperSet.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Helper/InputAwareHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => $vendorDir . '/symfony/console/Helper/OutputWrapper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => $vendorDir . '/symfony/console/Helper/ProcessHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Helper/ProgressBar.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => $vendorDir . '/symfony/console/Helper/ProgressIndicator.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Helper/QuestionHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => $vendorDir . '/symfony/console/Helper/SymfonyQuestionHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Helper/Table.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\TableCell' => $vendorDir . '/symfony/console/Helper/TableCell.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => $vendorDir . '/symfony/console/Helper/TableCellStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\TableRows' => $vendorDir . '/symfony/console/Helper/TableRows.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Helper/TableSeparator.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Helper/TableStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Input/ArgvInput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Input/ArrayInput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Input/Input.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Input/InputArgument.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Input/InputAwareInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Input/InputDefinition.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Input/InputInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Input/InputOption.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => $vendorDir . '/symfony/console/Input/StreamableInputInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Input/StringInput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Logger/ConsoleLogger.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => $vendorDir . '/symfony/console/Messenger/RunCommandContext.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => $vendorDir . '/symfony/console/Messenger/RunCommandMessage.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => $vendorDir . '/symfony/console/Messenger/RunCommandMessageHandler.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => $vendorDir . '/symfony/console/Output/AnsiColorMode.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Output/BufferedOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Output/ConsoleOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Output/ConsoleOutputInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => $vendorDir . '/symfony/console/Output/ConsoleSectionOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Output/NullOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Output/Output.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Output/OutputInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Output/StreamOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => $vendorDir . '/symfony/console/Output/TrimmedBufferOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Question/ChoiceQuestion.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Question/ConfirmationQuestion.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Question/Question.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => $vendorDir . '/symfony/console/SignalRegistry/SignalMap.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => $vendorDir . '/symfony/console/SignalRegistry/SignalRegistry.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\SingleCommandApplication' => $vendorDir . '/symfony/console/SingleCommandApplication.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Style\\OutputStyle' => $vendorDir . '/symfony/console/Style/OutputStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Style\\StyleInterface' => $vendorDir . '/symfony/console/Style/StyleInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => $vendorDir . '/symfony/console/Style/SymfonyStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Terminal' => $vendorDir . '/symfony/console/Terminal.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Tester/ApplicationTester.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => $vendorDir . '/symfony/console/Tester/CommandCompletionTester.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Tester/CommandTester.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => $vendorDir . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Tester\\TesterTrait' => $vendorDir . '/symfony/console/Tester/TesterTrait.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/ExceptionInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => $vendorDir . '/symfony/filesystem/Exception/FileNotFoundException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\IOException' => $vendorDir . '/symfony/filesystem/Exception/IOException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => $vendorDir . '/symfony/filesystem/Exception/IOExceptionInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/filesystem/Exception/InvalidArgumentException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => $vendorDir . '/symfony/filesystem/Exception/RuntimeException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Filesystem' => $vendorDir . '/symfony/filesystem/Filesystem.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Path' => $vendorDir . '/symfony/filesystem/Path.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\AbstractString' => $vendorDir . '/symfony/string/AbstractString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\AbstractUnicodeString' => $vendorDir . '/symfony/string/AbstractUnicodeString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\ByteString' => $vendorDir . '/symfony/string/ByteString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\CodePointString' => $vendorDir . '/symfony/string/CodePointString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/string/Exception/ExceptionInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Exception\\InvalidArgumentException' => $vendorDir . '/symfony/string/Exception/InvalidArgumentException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Exception\\RuntimeException' => $vendorDir . '/symfony/string/Exception/RuntimeException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Inflector\\EnglishInflector' => $vendorDir . '/symfony/string/Inflector/EnglishInflector.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Inflector\\FrenchInflector' => $vendorDir . '/symfony/string/Inflector/FrenchInflector.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Inflector\\InflectorInterface' => $vendorDir . '/symfony/string/Inflector/InflectorInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\LazyString' => $vendorDir . '/symfony/string/LazyString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Slugger\\AsciiSlugger' => $vendorDir . '/symfony/string/Slugger/AsciiSlugger.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Slugger\\SluggerInterface' => $vendorDir . '/symfony/string/Slugger/SluggerInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\UnicodeString' => $vendorDir . '/symfony/string/UnicodeString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\Attribute\\Required' => $vendorDir . '/symfony/service-contracts/Attribute/Required.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => $vendorDir . '/symfony/service-contracts/Attribute/SubscribedService.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\ResetInterface' => $vendorDir . '/symfony/service-contracts/ResetInterface.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => $vendorDir . '/symfony/service-contracts/ServiceLocatorTrait.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => $vendorDir . '/symfony/service-contracts/ServiceProviderInterface.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberInterface.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => $vendorDir . '/symfony/service-contracts/ServiceSubscriberTrait.php', + 'RuleDocGenerator202403\\Webmozart\\Assert\\Assert' => $vendorDir . '/webmozart/assert/src/Assert.php', + 'RuleDocGenerator202403\\Webmozart\\Assert\\InvalidArgumentException' => $vendorDir . '/webmozart/assert/src/InvalidArgumentException.php', + 'RuleDocGenerator202403\\Webmozart\\Assert\\Mixin' => $vendorDir . '/webmozart/assert/src/Mixin.php', + 'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php', + 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => $vendorDir . '/symfony/polyfill-intl-grapheme/Grapheme.php', + 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php', + 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', + 'Symplify\\RuleDocGenerator\\Command\\GenerateCommand' => $baseDir . '/src/Command/GenerateCommand.php', + 'Symplify\\RuleDocGenerator\\Contract\\Category\\CategoryInfererInterface' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/Contract/Category/CategoryInfererInterface.php', + 'Symplify\\RuleDocGenerator\\Contract\\CodeSampleInterface' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/Contract/CodeSampleInterface.php', + 'Symplify\\RuleDocGenerator\\Contract\\ConfigurableRuleInterface' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/Contract/ConfigurableRuleInterface.php', + 'Symplify\\RuleDocGenerator\\Contract\\DocumentedRuleInterface' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/Contract/DocumentedRuleInterface.php', + 'Symplify\\RuleDocGenerator\\Contract\\RuleCodeSamplePrinterInterface' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/Contract/RuleCodeSamplePrinterInterface.php', + 'Symplify\\RuleDocGenerator\\DependencyInjection\\ContainerFactory' => $baseDir . '/src/DependencyInjection/ContainerFactory.php', + 'Symplify\\RuleDocGenerator\\DirectoryToMarkdownPrinter' => $baseDir . '/src/DirectoryToMarkdownPrinter.php', + 'Symplify\\RuleDocGenerator\\Exception\\ConfigurationBoundException' => $baseDir . '/src/Exception/ConfigurationBoundException.php', + 'Symplify\\RuleDocGenerator\\Exception\\PoorDocumentationException' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/Exception/PoorDocumentationException.php', + 'Symplify\\RuleDocGenerator\\Exception\\ShouldNotHappenException' => $baseDir . '/src/Exception/ShouldNotHappenException.php', + 'Symplify\\RuleDocGenerator\\FileSystem\\ClassByTypeFinder' => $baseDir . '/src/FileSystem/ClassByTypeFinder.php', + 'Symplify\\RuleDocGenerator\\FileSystem\\PathsHelper' => $baseDir . '/src/FileSystem/PathsHelper.php', + 'Symplify\\RuleDocGenerator\\Printer\\CodeSamplePrinter\\BadGoodCodeSamplePrinter' => $baseDir . '/src/Printer/CodeSamplePrinter/BadGoodCodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\Printer\\CodeSamplePrinter\\CodeSamplePrinter' => $baseDir . '/src/Printer/CodeSamplePrinter/CodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\Printer\\CodeSamplePrinter\\DiffCodeSamplePrinter' => $baseDir . '/src/Printer/CodeSamplePrinter/DiffCodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\Printer\\Markdown\\MarkdownCodeWrapper' => $baseDir . '/src/Printer/Markdown/MarkdownCodeWrapper.php', + 'Symplify\\RuleDocGenerator\\Printer\\Markdown\\MarkdownDiffer' => $baseDir . '/src/Printer/Markdown/MarkdownDiffer.php', + 'Symplify\\RuleDocGenerator\\Printer\\NeonPrinter' => $baseDir . '/src/Printer/NeonPrinter.php', + 'Symplify\\RuleDocGenerator\\Printer\\RuleDefinitionsPrinter' => $baseDir . '/src/Printer/RuleDefinitionsPrinter.php', + 'Symplify\\RuleDocGenerator\\RuleCodeSamplePrinter\\ECSRuleCodeSamplePrinter' => $baseDir . '/src/RuleCodeSamplePrinter/ECSRuleCodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\RuleCodeSamplePrinter\\PHPStanRuleCodeSamplePrinter' => $baseDir . '/src/RuleCodeSamplePrinter/PHPStanRuleCodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\RuleCodeSamplePrinter\\RectorRuleCodeSamplePrinter' => $baseDir . '/src/RuleCodeSamplePrinter/RectorRuleCodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\RuleDefinitionsResolver' => $baseDir . '/src/RuleDefinitionsResolver.php', + 'Symplify\\RuleDocGenerator\\Text\\KeywordHighlighter' => $baseDir . '/src/Text/KeywordHighlighter.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\AbstractCodeSample' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/ValueObject/AbstractCodeSample.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\CodeSample\\CodeSample' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/CodeSample.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\CodeSample\\ComposerJsonAwareCodeSample' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ComposerJsonAwareCodeSample.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\CodeSample\\ConfiguredCodeSample' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ConfiguredCodeSample.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\CodeSample\\ExtraFileCodeSample' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ExtraFileCodeSample.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\Option' => $baseDir . '/src/ValueObject/Option.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\RuleClassWithFilePath' => $baseDir . '/src/ValueObject/RuleClassWithFilePath.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\RuleDefinition' => $vendorDir . '/symplify/rule-doc-generator-contracts/src/ValueObject/RuleDefinition.php', +); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php new file mode 100644 index 00000000..268610ea --- /dev/null +++ b/vendor/composer/autoload_files.php @@ -0,0 +1,15 @@ + $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', + '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', + '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', + 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php', +); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php new file mode 100644 index 00000000..15a2ff3a --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($baseDir . '/src', $vendorDir . '/symplify/rule-doc-generator-contracts/src'), + 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), + 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'), + 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), + 'RuleDocGenerator202403\\Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), + 'RuleDocGenerator202403\\Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'), + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'), + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), + 'RuleDocGenerator202403\\Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), + 'RuleDocGenerator202403\\Psr\\Container\\' => array($vendorDir . '/psr/container/src'), + 'RuleDocGenerator202403\\Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'), + 'RuleDocGenerator202403\\Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 00000000..26098852 --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,51 @@ +setClassMapAuthoritative(true); + $loader->register(true); + + $filesToLoad = \Composer\Autoload\ComposerStaticInitaf28f2cd2f6819a2088b0cda3edab33b::$files; + $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + + require $file; + } + }, null, null); + foreach ($filesToLoad as $fileIdentifier => $file) { + $requireFile($fileIdentifier, $file); + } + + return $loader; + } +} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php new file mode 100644 index 00000000..f3ad9dc7 --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,530 @@ + __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', + '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', + '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', + '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', + 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'S' => + array ( + 'Symplify\\RuleDocGenerator\\' => 26, + 'Symfony\\Polyfill\\Mbstring\\' => 26, + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, + 'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31, + 'Symfony\\Polyfill\\Ctype\\' => 23, + ), + 'R' => + array ( + 'RuleDocGenerator202403\\Webmozart\\Assert\\' => 40, + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\' => 49, + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\' => 46, + 'RuleDocGenerator202403\\Symfony\\Component\\String\\' => 48, + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\' => 52, + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\' => 49, + 'RuleDocGenerator202403\\Psr\\SimpleCache\\' => 39, + 'RuleDocGenerator202403\\Psr\\Container\\' => 37, + 'RuleDocGenerator202403\\Illuminate\\Contracts\\' => 44, + 'RuleDocGenerator202403\\Illuminate\\Container\\' => 44, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Symplify\\RuleDocGenerator\\' => + array ( + 0 => __DIR__ . '/../..' . '/src', + 1 => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src', + ), + 'Symfony\\Polyfill\\Mbstring\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', + ), + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', + ), + 'Symfony\\Polyfill\\Intl\\Grapheme\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme', + ), + 'Symfony\\Polyfill\\Ctype\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', + ), + 'RuleDocGenerator202403\\Webmozart\\Assert\\' => + array ( + 0 => __DIR__ . '/..' . '/webmozart/assert/src', + ), + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/service-contracts', + ), + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/yaml', + ), + 'RuleDocGenerator202403\\Symfony\\Component\\String\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/string', + ), + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/filesystem', + ), + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/console', + ), + 'RuleDocGenerator202403\\Psr\\SimpleCache\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/simple-cache/src', + ), + 'RuleDocGenerator202403\\Psr\\Container\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/container/src', + ), + 'RuleDocGenerator202403\\Illuminate\\Contracts\\' => + array ( + 0 => __DIR__ . '/..' . '/illuminate/contracts', + ), + 'RuleDocGenerator202403\\Illuminate\\Container\\' => + array ( + 0 => __DIR__ . '/..' . '/illuminate/container', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\BoundMethod' => __DIR__ . '/..' . '/illuminate/container/BoundMethod.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\Container' => __DIR__ . '/..' . '/illuminate/container/Container.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/container/ContextualBindingBuilder.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\EntryNotFoundException' => __DIR__ . '/..' . '/illuminate/container/EntryNotFoundException.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\RewindableGenerator' => __DIR__ . '/..' . '/illuminate/container/RewindableGenerator.php', + 'RuleDocGenerator202403\\Illuminate\\Container\\Util' => __DIR__ . '/..' . '/illuminate/container/Util.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Access\\Authorizable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Authorizable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Access\\Gate' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Access/Gate.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Authenticatable' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Authenticatable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\CanResetPassword' => __DIR__ . '/..' . '/illuminate/contracts/Auth/CanResetPassword.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Guard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Guard.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\Middleware\\AuthenticatesRequests' => __DIR__ . '/..' . '/illuminate/contracts/Auth/Middleware/AuthenticatesRequests.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\MustVerifyEmail' => __DIR__ . '/..' . '/illuminate/contracts/Auth/MustVerifyEmail.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\PasswordBroker' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBroker.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\PasswordBrokerFactory' => __DIR__ . '/..' . '/illuminate/contracts/Auth/PasswordBrokerFactory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\StatefulGuard' => __DIR__ . '/..' . '/illuminate/contracts/Auth/StatefulGuard.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\SupportsBasicAuth' => __DIR__ . '/..' . '/illuminate/contracts/Auth/SupportsBasicAuth.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Auth\\UserProvider' => __DIR__ . '/..' . '/illuminate/contracts/Auth/UserProvider.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\Broadcaster' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Broadcaster.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\HasBroadcastChannel' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/HasBroadcastChannel.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBeUnique.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcast.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Broadcasting\\ShouldBroadcastNow' => __DIR__ . '/..' . '/illuminate/contracts/Broadcasting/ShouldBroadcastNow.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Bus\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/Dispatcher.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Bus\\QueueingDispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Bus/QueueingDispatcher.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\Lock' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Lock.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\LockProvider' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockProvider.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Cache/LockTimeoutException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Repository.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cache\\Store' => __DIR__ . '/..' . '/illuminate/contracts/Cache/Store.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Config\\Repository' => __DIR__ . '/..' . '/illuminate/contracts/Config/Repository.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Console\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Console/Application.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Console\\Isolatable' => __DIR__ . '/..' . '/illuminate/contracts/Console/Isolatable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Console\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Console/Kernel.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Console\\PromptsForMissingInput' => __DIR__ . '/..' . '/illuminate/contracts/Console/PromptsForMissingInput.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Container\\BindingResolutionException' => __DIR__ . '/..' . '/illuminate/contracts/Container/BindingResolutionException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Container\\CircularDependencyException' => __DIR__ . '/..' . '/illuminate/contracts/Container/CircularDependencyException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Container\\Container' => __DIR__ . '/..' . '/illuminate/contracts/Container/Container.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Container\\ContextualBindingBuilder' => __DIR__ . '/..' . '/illuminate/contracts/Container/ContextualBindingBuilder.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cookie\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Cookie\\QueueingFactory' => __DIR__ . '/..' . '/illuminate/contracts/Cookie/QueueingFactory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Builder.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\Castable' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/Castable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\CastsAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsAttributes.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\CastsInboundAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\DeviatesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/DeviatesCastableAttributes.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\SerializesCastableAttributes' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SerializesCastableAttributes.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Eloquent\\SupportsPartialRelations' => __DIR__ . '/..' . '/illuminate/contracts/Database/Eloquent/SupportsPartialRelations.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Events\\MigrationEvent' => __DIR__ . '/..' . '/illuminate/contracts/Database/Events/MigrationEvent.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\ModelIdentifier' => __DIR__ . '/..' . '/illuminate/contracts/Database/ModelIdentifier.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Query\\Builder' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Builder.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Query\\ConditionExpression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/ConditionExpression.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Database\\Query\\Expression' => __DIR__ . '/..' . '/illuminate/contracts/Database/Query/Expression.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Debug\\ExceptionHandler' => __DIR__ . '/..' . '/illuminate/contracts/Debug/ExceptionHandler.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Encryption\\DecryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/DecryptException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Encryption\\EncryptException' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/EncryptException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Encryption\\Encrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/Encrypter.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Encryption\\StringEncrypter' => __DIR__ . '/..' . '/illuminate/contracts/Encryption/StringEncrypter.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Events\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Events/Dispatcher.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Events\\ShouldDispatchAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldDispatchAfterCommit.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Events\\ShouldHandleEventsAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Events/ShouldHandleEventsAfterCommit.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Filesystem\\Cloud' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Cloud.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Filesystem\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Filesystem\\FileNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/FileNotFoundException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/Filesystem.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Filesystem\\LockTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Filesystem/LockTimeoutException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Foundation\\Application' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/Application.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Foundation\\CachesConfiguration' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesConfiguration.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Foundation\\CachesRoutes' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/CachesRoutes.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Foundation\\ExceptionRenderer' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/ExceptionRenderer.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Foundation\\MaintenanceMode' => __DIR__ . '/..' . '/illuminate/contracts/Foundation/MaintenanceMode.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Hashing\\Hasher' => __DIR__ . '/..' . '/illuminate/contracts/Hashing/Hasher.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Http\\Kernel' => __DIR__ . '/..' . '/illuminate/contracts/Http/Kernel.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Mail\\Attachable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Attachable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Mail\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Mail\\MailQueue' => __DIR__ . '/..' . '/illuminate/contracts/Mail/MailQueue.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Mail\\Mailable' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Mail\\Mailer' => __DIR__ . '/..' . '/illuminate/contracts/Mail/Mailer.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Notifications\\Dispatcher' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Dispatcher.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Notifications\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Notifications/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Pagination\\CursorPaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/CursorPaginator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Pagination\\LengthAwarePaginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/LengthAwarePaginator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Pagination\\Paginator' => __DIR__ . '/..' . '/illuminate/contracts/Pagination/Paginator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Pipeline\\Hub' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Hub.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Pipeline\\Pipeline' => __DIR__ . '/..' . '/illuminate/contracts/Pipeline/Pipeline.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Process\\InvokedProcess' => __DIR__ . '/..' . '/illuminate/contracts/Process/InvokedProcess.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Process\\ProcessResult' => __DIR__ . '/..' . '/illuminate/contracts/Process/ProcessResult.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ClearableQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ClearableQueue.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\EntityNotFoundException' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityNotFoundException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\EntityResolver' => __DIR__ . '/..' . '/illuminate/contracts/Queue/EntityResolver.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\Job' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Job.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\Monitor' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Monitor.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\Queue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/Queue.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\QueueableCollection' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableCollection.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\QueueableEntity' => __DIR__ . '/..' . '/illuminate/contracts/Queue/QueueableEntity.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ShouldBeEncrypted' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeEncrypted.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ShouldBeUnique' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUnique.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ShouldBeUniqueUntilProcessing' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldBeUniqueUntilProcessing.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ShouldQueue' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueue.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Queue\\ShouldQueueAfterCommit' => __DIR__ . '/..' . '/illuminate/contracts/Queue/ShouldQueueAfterCommit.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Redis\\Connection' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connection.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Redis\\Connector' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Connector.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Redis\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Redis/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Redis\\LimiterTimeoutException' => __DIR__ . '/..' . '/illuminate/contracts/Redis/LimiterTimeoutException.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Routing\\BindingRegistrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/BindingRegistrar.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Routing\\Registrar' => __DIR__ . '/..' . '/illuminate/contracts/Routing/Registrar.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Routing\\ResponseFactory' => __DIR__ . '/..' . '/illuminate/contracts/Routing/ResponseFactory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Routing\\UrlGenerator' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlGenerator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Routing\\UrlRoutable' => __DIR__ . '/..' . '/illuminate/contracts/Routing/UrlRoutable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Session\\Middleware\\AuthenticatesSessions' => __DIR__ . '/..' . '/illuminate/contracts/Session/Middleware/AuthenticatesSessions.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Session\\Session' => __DIR__ . '/..' . '/illuminate/contracts/Session/Session.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\Arrayable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Arrayable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\CanBeEscapedWhenCastToString' => __DIR__ . '/..' . '/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\DeferrableProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferrableProvider.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\DeferringDisplayableValue' => __DIR__ . '/..' . '/illuminate/contracts/Support/DeferringDisplayableValue.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\Htmlable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Htmlable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\Jsonable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Jsonable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\MessageBag' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageBag.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\MessageProvider' => __DIR__ . '/..' . '/illuminate/contracts/Support/MessageProvider.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\Renderable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Renderable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\Responsable' => __DIR__ . '/..' . '/illuminate/contracts/Support/Responsable.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Support\\ValidatedData' => __DIR__ . '/..' . '/illuminate/contracts/Support/ValidatedData.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Translation\\HasLocalePreference' => __DIR__ . '/..' . '/illuminate/contracts/Translation/HasLocalePreference.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Translation\\Loader' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Loader.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Translation\\Translator' => __DIR__ . '/..' . '/illuminate/contracts/Translation/Translator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\DataAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/DataAwareRule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\ImplicitRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ImplicitRule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\InvokableRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/InvokableRule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\Rule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Rule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\UncompromisedVerifier' => __DIR__ . '/..' . '/illuminate/contracts/Validation/UncompromisedVerifier.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\ValidatesWhenResolved' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatesWhenResolved.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\ValidationRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidationRule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\Validator' => __DIR__ . '/..' . '/illuminate/contracts/Validation/Validator.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\Validation\\ValidatorAwareRule' => __DIR__ . '/..' . '/illuminate/contracts/Validation/ValidatorAwareRule.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\View\\Engine' => __DIR__ . '/..' . '/illuminate/contracts/View/Engine.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\View\\Factory' => __DIR__ . '/..' . '/illuminate/contracts/View/Factory.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\View\\View' => __DIR__ . '/..' . '/illuminate/contracts/View/View.php', + 'RuleDocGenerator202403\\Illuminate\\Contracts\\View\\ViewCompilationException' => __DIR__ . '/..' . '/illuminate/contracts/View/ViewCompilationException.php', + 'RuleDocGenerator202403\\Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\HtmlStringable' => __DIR__ . '/..' . '/nette/utils/src/HtmlStringable.php', + 'RuleDocGenerator202403\\Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php', + 'RuleDocGenerator202403\\Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php', + 'RuleDocGenerator202403\\Nette\\Loaders\\RobotLoader' => __DIR__ . '/..' . '/nette/robot-loader/src/RobotLoader/RobotLoader.php', + 'RuleDocGenerator202403\\Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', + 'RuleDocGenerator202403\\Nette\\Localization\\Translator' => __DIR__ . '/..' . '/nette/utils/src/Translator.php', + 'RuleDocGenerator202403\\Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/SmartObject.php', + 'RuleDocGenerator202403\\Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/StaticClass.php', + 'RuleDocGenerator202403\\Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php', + 'RuleDocGenerator202403\\Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php', + 'RuleDocGenerator202403\\Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php', + 'RuleDocGenerator202403\\Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php', + 'RuleDocGenerator202403\\Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Finder' => __DIR__ . '/..' . '/nette/finder/src/Utils/Finder.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Floats' => __DIR__ . '/..' . '/nette/utils/src/Utils/Floats.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Helpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/Helpers.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php', + 'RuleDocGenerator202403\\Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php', + 'RuleDocGenerator202403\\Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php', + 'RuleDocGenerator202403\\Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php', + 'RuleDocGenerator202403\\Nette\\Utils\\ObjectMixin' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectMixin.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php', + 'RuleDocGenerator202403\\Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php', + 'RuleDocGenerator202403\\Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php', + 'RuleDocGenerator202403\\Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php', + 'RuleDocGenerator202403\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', + 'RuleDocGenerator202403\\Psr\\Container\\ContainerExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerExceptionInterface.php', + 'RuleDocGenerator202403\\Psr\\Container\\ContainerInterface' => __DIR__ . '/..' . '/psr/container/src/ContainerInterface.php', + 'RuleDocGenerator202403\\Psr\\Container\\NotFoundExceptionInterface' => __DIR__ . '/..' . '/psr/container/src/NotFoundExceptionInterface.php', + 'RuleDocGenerator202403\\Psr\\SimpleCache\\CacheException' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheException.php', + 'RuleDocGenerator202403\\Psr\\SimpleCache\\CacheInterface' => __DIR__ . '/..' . '/psr/simple-cache/src/CacheInterface.php', + 'RuleDocGenerator202403\\Psr\\SimpleCache\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/simple-cache/src/InvalidArgumentException.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\ConfigurationException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/ConfigurationException.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Exception' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/Exception.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/diff/src/Exception/InvalidArgumentException.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\LongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/LongestCommonSubsequenceCalculator.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\MemoryEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Output\\AbstractChunkOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Output\\DiffOnlyOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Output\\DiffOutputBuilderInterface' => __DIR__ . '/..' . '/sebastian/diff/src/Output/DiffOutputBuilderInterface.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Output\\StrictUnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder' => __DIR__ . '/..' . '/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', + 'RuleDocGenerator202403\\SebastianBergmann\\Diff\\TimeEfficientLongestCommonSubsequenceCalculator' => __DIR__ . '/..' . '/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Application' => __DIR__ . '/..' . '/symfony/console/Application.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Attribute\\AsCommand' => __DIR__ . '/..' . '/symfony/console/Attribute/AsCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\CI\\GithubActionReporter' => __DIR__ . '/..' . '/symfony/console/CI/GithubActionReporter.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Color' => __DIR__ . '/..' . '/symfony/console/Color.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\CommandLoader\\CommandLoaderInterface' => __DIR__ . '/..' . '/symfony/console/CommandLoader/CommandLoaderInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\CommandLoader\\ContainerCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/ContainerCommandLoader.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\CommandLoader\\FactoryCommandLoader' => __DIR__ . '/..' . '/symfony/console/CommandLoader/FactoryCommandLoader.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\Command' => __DIR__ . '/..' . '/symfony/console/Command/Command.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\CompleteCommand' => __DIR__ . '/..' . '/symfony/console/Command/CompleteCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\DumpCompletionCommand' => __DIR__ . '/..' . '/symfony/console/Command/DumpCompletionCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\HelpCommand' => __DIR__ . '/..' . '/symfony/console/Command/HelpCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\LazyCommand' => __DIR__ . '/..' . '/symfony/console/Command/LazyCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\ListCommand' => __DIR__ . '/..' . '/symfony/console/Command/ListCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\LockableTrait' => __DIR__ . '/..' . '/symfony/console/Command/LockableTrait.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\SignalableCommandInterface' => __DIR__ . '/..' . '/symfony/console/Command/SignalableCommandInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Command\\TraceableCommand' => __DIR__ . '/..' . '/symfony/console/Command/TraceableCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\CompletionInput' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionInput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\CompletionSuggestions' => __DIR__ . '/..' . '/symfony/console/Completion/CompletionSuggestions.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\Output\\BashCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/BashCompletionOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\Output\\CompletionOutputInterface' => __DIR__ . '/..' . '/symfony/console/Completion/Output/CompletionOutputInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\Output\\FishCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/FishCompletionOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\Output\\ZshCompletionOutput' => __DIR__ . '/..' . '/symfony/console/Completion/Output/ZshCompletionOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Completion\\Suggestion' => __DIR__ . '/..' . '/symfony/console/Completion/Suggestion.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\ConsoleEvents' => __DIR__ . '/..' . '/symfony/console/ConsoleEvents.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Cursor' => __DIR__ . '/..' . '/symfony/console/Cursor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\DataCollector\\CommandDataCollector' => __DIR__ . '/..' . '/symfony/console/DataCollector/CommandDataCollector.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Debug\\CliRequest' => __DIR__ . '/..' . '/symfony/console/Debug/CliRequest.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\DependencyInjection\\AddConsoleCommandPass' => __DIR__ . '/..' . '/symfony/console/DependencyInjection/AddConsoleCommandPass.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => __DIR__ . '/..' . '/symfony/console/Descriptor/ApplicationDescription.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\Descriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/Descriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => __DIR__ . '/..' . '/symfony/console/Descriptor/DescriptorInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/JsonDescriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/MarkdownDescriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\ReStructuredTextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/ReStructuredTextDescriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/TextDescriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => __DIR__ . '/..' . '/symfony/console/Descriptor/XmlDescriptor.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\EventListener\\ErrorListener' => __DIR__ . '/..' . '/symfony/console/EventListener/ErrorListener.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleCommandEvent.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Event\\ConsoleErrorEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleErrorEvent.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Event\\ConsoleEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleEvent.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Event\\ConsoleSignalEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleSignalEvent.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => __DIR__ . '/..' . '/symfony/console/Event/ConsoleTerminateEvent.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\CommandNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/CommandNotFoundException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/console/Exception/ExceptionInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidArgumentException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\InvalidOptionException' => __DIR__ . '/..' . '/symfony/console/Exception/InvalidOptionException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\LogicException' => __DIR__ . '/..' . '/symfony/console/Exception/LogicException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\MissingInputException' => __DIR__ . '/..' . '/symfony/console/Exception/MissingInputException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\NamespaceNotFoundException' => __DIR__ . '/..' . '/symfony/console/Exception/NamespaceNotFoundException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\RunCommandFailedException' => __DIR__ . '/..' . '/symfony/console/Exception/RunCommandFailedException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/console/Exception/RuntimeException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatter.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\NullOutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/NullOutputFormatterStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\OutputFormatter' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatter.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => __DIR__ . '/..' . '/symfony/console/Formatter/OutputFormatterStyleStack.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Formatter\\WrappableOutputFormatterInterface' => __DIR__ . '/..' . '/symfony/console/Formatter/WrappableOutputFormatterInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\DebugFormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DebugFormatterHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\DescriptorHelper' => __DIR__ . '/..' . '/symfony/console/Helper/DescriptorHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\Dumper' => __DIR__ . '/..' . '/symfony/console/Helper/Dumper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\FormatterHelper' => __DIR__ . '/..' . '/symfony/console/Helper/FormatterHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\Helper' => __DIR__ . '/..' . '/symfony/console/Helper/Helper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\HelperInterface' => __DIR__ . '/..' . '/symfony/console/Helper/HelperInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\HelperSet' => __DIR__ . '/..' . '/symfony/console/Helper/HelperSet.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\InputAwareHelper' => __DIR__ . '/..' . '/symfony/console/Helper/InputAwareHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\OutputWrapper' => __DIR__ . '/..' . '/symfony/console/Helper/OutputWrapper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\ProcessHelper' => __DIR__ . '/..' . '/symfony/console/Helper/ProcessHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\ProgressBar' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressBar.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\ProgressIndicator' => __DIR__ . '/..' . '/symfony/console/Helper/ProgressIndicator.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\QuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/QuestionHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\SymfonyQuestionHelper' => __DIR__ . '/..' . '/symfony/console/Helper/SymfonyQuestionHelper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\Table' => __DIR__ . '/..' . '/symfony/console/Helper/Table.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\TableCell' => __DIR__ . '/..' . '/symfony/console/Helper/TableCell.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\TableCellStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableCellStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\TableRows' => __DIR__ . '/..' . '/symfony/console/Helper/TableRows.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\TableSeparator' => __DIR__ . '/..' . '/symfony/console/Helper/TableSeparator.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Helper\\TableStyle' => __DIR__ . '/..' . '/symfony/console/Helper/TableStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\ArgvInput' => __DIR__ . '/..' . '/symfony/console/Input/ArgvInput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\ArrayInput' => __DIR__ . '/..' . '/symfony/console/Input/ArrayInput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\Input' => __DIR__ . '/..' . '/symfony/console/Input/Input.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\InputArgument' => __DIR__ . '/..' . '/symfony/console/Input/InputArgument.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\InputAwareInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputAwareInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\InputDefinition' => __DIR__ . '/..' . '/symfony/console/Input/InputDefinition.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\InputInterface' => __DIR__ . '/..' . '/symfony/console/Input/InputInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\InputOption' => __DIR__ . '/..' . '/symfony/console/Input/InputOption.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\StreamableInputInterface' => __DIR__ . '/..' . '/symfony/console/Input/StreamableInputInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Input\\StringInput' => __DIR__ . '/..' . '/symfony/console/Input/StringInput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Logger\\ConsoleLogger' => __DIR__ . '/..' . '/symfony/console/Logger/ConsoleLogger.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Messenger\\RunCommandContext' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandContext.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Messenger\\RunCommandMessage' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessage.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Messenger\\RunCommandMessageHandler' => __DIR__ . '/..' . '/symfony/console/Messenger/RunCommandMessageHandler.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\AnsiColorMode' => __DIR__ . '/..' . '/symfony/console/Output/AnsiColorMode.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\BufferedOutput' => __DIR__ . '/..' . '/symfony/console/Output/BufferedOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\ConsoleOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleOutputInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\ConsoleSectionOutput' => __DIR__ . '/..' . '/symfony/console/Output/ConsoleSectionOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\NullOutput' => __DIR__ . '/..' . '/symfony/console/Output/NullOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\Output' => __DIR__ . '/..' . '/symfony/console/Output/Output.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\OutputInterface' => __DIR__ . '/..' . '/symfony/console/Output/OutputInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\StreamOutput' => __DIR__ . '/..' . '/symfony/console/Output/StreamOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Output\\TrimmedBufferOutput' => __DIR__ . '/..' . '/symfony/console/Output/TrimmedBufferOutput.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Question\\ChoiceQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ChoiceQuestion.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => __DIR__ . '/..' . '/symfony/console/Question/ConfirmationQuestion.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Question\\Question' => __DIR__ . '/..' . '/symfony/console/Question/Question.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\SignalRegistry\\SignalMap' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalMap.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\SignalRegistry\\SignalRegistry' => __DIR__ . '/..' . '/symfony/console/SignalRegistry/SignalRegistry.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\SingleCommandApplication' => __DIR__ . '/..' . '/symfony/console/SingleCommandApplication.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Style\\OutputStyle' => __DIR__ . '/..' . '/symfony/console/Style/OutputStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Style\\StyleInterface' => __DIR__ . '/..' . '/symfony/console/Style/StyleInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Style\\SymfonyStyle' => __DIR__ . '/..' . '/symfony/console/Style/SymfonyStyle.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Terminal' => __DIR__ . '/..' . '/symfony/console/Terminal.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Tester\\ApplicationTester' => __DIR__ . '/..' . '/symfony/console/Tester/ApplicationTester.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Tester\\CommandCompletionTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandCompletionTester.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Tester\\CommandTester' => __DIR__ . '/..' . '/symfony/console/Tester/CommandTester.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Tester\\Constraint\\CommandIsSuccessful' => __DIR__ . '/..' . '/symfony/console/Tester/Constraint/CommandIsSuccessful.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Console\\Tester\\TesterTrait' => __DIR__ . '/..' . '/symfony/console/Tester/TesterTrait.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/ExceptionInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/FileNotFoundException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\IOException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\IOExceptionInterface' => __DIR__ . '/..' . '/symfony/filesystem/Exception/IOExceptionInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/InvalidArgumentException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/filesystem/Exception/RuntimeException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Filesystem' => __DIR__ . '/..' . '/symfony/filesystem/Filesystem.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\Path' => __DIR__ . '/..' . '/symfony/filesystem/Path.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\AbstractString' => __DIR__ . '/..' . '/symfony/string/AbstractString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\AbstractUnicodeString' => __DIR__ . '/..' . '/symfony/string/AbstractUnicodeString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\ByteString' => __DIR__ . '/..' . '/symfony/string/ByteString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\CodePointString' => __DIR__ . '/..' . '/symfony/string/CodePointString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/string/Exception/ExceptionInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/symfony/string/Exception/InvalidArgumentException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/string/Exception/RuntimeException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Inflector\\EnglishInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/EnglishInflector.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Inflector\\FrenchInflector' => __DIR__ . '/..' . '/symfony/string/Inflector/FrenchInflector.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Inflector\\InflectorInterface' => __DIR__ . '/..' . '/symfony/string/Inflector/InflectorInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\LazyString' => __DIR__ . '/..' . '/symfony/string/LazyString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Slugger\\AsciiSlugger' => __DIR__ . '/..' . '/symfony/string/Slugger/AsciiSlugger.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\Slugger\\SluggerInterface' => __DIR__ . '/..' . '/symfony/string/Slugger/SluggerInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\String\\UnicodeString' => __DIR__ . '/..' . '/symfony/string/UnicodeString.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Exception\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php', + 'RuleDocGenerator202403\\Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\Attribute\\Required' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/Required.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\Attribute\\SubscribedService' => __DIR__ . '/..' . '/symfony/service-contracts/Attribute/SubscribedService.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\ResetInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ResetInterface.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\ServiceLocatorTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceLocatorTrait.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\ServiceProviderInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceProviderInterface.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\ServiceSubscriberInterface' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberInterface.php', + 'RuleDocGenerator202403\\Symfony\\Contracts\\Service\\ServiceSubscriberTrait' => __DIR__ . '/..' . '/symfony/service-contracts/ServiceSubscriberTrait.php', + 'RuleDocGenerator202403\\Webmozart\\Assert\\Assert' => __DIR__ . '/..' . '/webmozart/assert/src/Assert.php', + 'RuleDocGenerator202403\\Webmozart\\Assert\\InvalidArgumentException' => __DIR__ . '/..' . '/webmozart/assert/src/InvalidArgumentException.php', + 'RuleDocGenerator202403\\Webmozart\\Assert\\Mixin' => __DIR__ . '/..' . '/webmozart/assert/src/Mixin.php', + 'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php', + 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/Grapheme.php', + 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php', + 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', + 'Symplify\\RuleDocGenerator\\Command\\GenerateCommand' => __DIR__ . '/../..' . '/src/Command/GenerateCommand.php', + 'Symplify\\RuleDocGenerator\\Contract\\Category\\CategoryInfererInterface' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/Contract/Category/CategoryInfererInterface.php', + 'Symplify\\RuleDocGenerator\\Contract\\CodeSampleInterface' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/Contract/CodeSampleInterface.php', + 'Symplify\\RuleDocGenerator\\Contract\\ConfigurableRuleInterface' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/Contract/ConfigurableRuleInterface.php', + 'Symplify\\RuleDocGenerator\\Contract\\DocumentedRuleInterface' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/Contract/DocumentedRuleInterface.php', + 'Symplify\\RuleDocGenerator\\Contract\\RuleCodeSamplePrinterInterface' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/Contract/RuleCodeSamplePrinterInterface.php', + 'Symplify\\RuleDocGenerator\\DependencyInjection\\ContainerFactory' => __DIR__ . '/../..' . '/src/DependencyInjection/ContainerFactory.php', + 'Symplify\\RuleDocGenerator\\DirectoryToMarkdownPrinter' => __DIR__ . '/../..' . '/src/DirectoryToMarkdownPrinter.php', + 'Symplify\\RuleDocGenerator\\Exception\\ConfigurationBoundException' => __DIR__ . '/../..' . '/src/Exception/ConfigurationBoundException.php', + 'Symplify\\RuleDocGenerator\\Exception\\PoorDocumentationException' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/Exception/PoorDocumentationException.php', + 'Symplify\\RuleDocGenerator\\Exception\\ShouldNotHappenException' => __DIR__ . '/../..' . '/src/Exception/ShouldNotHappenException.php', + 'Symplify\\RuleDocGenerator\\FileSystem\\ClassByTypeFinder' => __DIR__ . '/../..' . '/src/FileSystem/ClassByTypeFinder.php', + 'Symplify\\RuleDocGenerator\\FileSystem\\PathsHelper' => __DIR__ . '/../..' . '/src/FileSystem/PathsHelper.php', + 'Symplify\\RuleDocGenerator\\Printer\\CodeSamplePrinter\\BadGoodCodeSamplePrinter' => __DIR__ . '/../..' . '/src/Printer/CodeSamplePrinter/BadGoodCodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\Printer\\CodeSamplePrinter\\CodeSamplePrinter' => __DIR__ . '/../..' . '/src/Printer/CodeSamplePrinter/CodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\Printer\\CodeSamplePrinter\\DiffCodeSamplePrinter' => __DIR__ . '/../..' . '/src/Printer/CodeSamplePrinter/DiffCodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\Printer\\Markdown\\MarkdownCodeWrapper' => __DIR__ . '/../..' . '/src/Printer/Markdown/MarkdownCodeWrapper.php', + 'Symplify\\RuleDocGenerator\\Printer\\Markdown\\MarkdownDiffer' => __DIR__ . '/../..' . '/src/Printer/Markdown/MarkdownDiffer.php', + 'Symplify\\RuleDocGenerator\\Printer\\NeonPrinter' => __DIR__ . '/../..' . '/src/Printer/NeonPrinter.php', + 'Symplify\\RuleDocGenerator\\Printer\\RuleDefinitionsPrinter' => __DIR__ . '/../..' . '/src/Printer/RuleDefinitionsPrinter.php', + 'Symplify\\RuleDocGenerator\\RuleCodeSamplePrinter\\ECSRuleCodeSamplePrinter' => __DIR__ . '/../..' . '/src/RuleCodeSamplePrinter/ECSRuleCodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\RuleCodeSamplePrinter\\PHPStanRuleCodeSamplePrinter' => __DIR__ . '/../..' . '/src/RuleCodeSamplePrinter/PHPStanRuleCodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\RuleCodeSamplePrinter\\RectorRuleCodeSamplePrinter' => __DIR__ . '/../..' . '/src/RuleCodeSamplePrinter/RectorRuleCodeSamplePrinter.php', + 'Symplify\\RuleDocGenerator\\RuleDefinitionsResolver' => __DIR__ . '/../..' . '/src/RuleDefinitionsResolver.php', + 'Symplify\\RuleDocGenerator\\Text\\KeywordHighlighter' => __DIR__ . '/../..' . '/src/Text/KeywordHighlighter.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\AbstractCodeSample' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/ValueObject/AbstractCodeSample.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\CodeSample\\CodeSample' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/CodeSample.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\CodeSample\\ComposerJsonAwareCodeSample' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ComposerJsonAwareCodeSample.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\CodeSample\\ConfiguredCodeSample' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ConfiguredCodeSample.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\CodeSample\\ExtraFileCodeSample' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ExtraFileCodeSample.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\Option' => __DIR__ . '/../..' . '/src/ValueObject/Option.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\RuleClassWithFilePath' => __DIR__ . '/../..' . '/src/ValueObject/RuleClassWithFilePath.php', + 'Symplify\\RuleDocGenerator\\ValueObject\\RuleDefinition' => __DIR__ . '/..' . '/symplify/rule-doc-generator-contracts/src/ValueObject/RuleDefinition.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInitaf28f2cd2f6819a2088b0cda3edab33b::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitaf28f2cd2f6819a2088b0cda3edab33b::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitaf28f2cd2f6819a2088b0cda3edab33b::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 00000000..57f0ca5b --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,1456 @@ +{ + "packages": [ + { + "name": "illuminate\/container", + "version": "v11.0.7", + "version_normalized": "11.0.7.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/illuminate\/container.git", + "reference": "78cbe88cdc7300efd4cf90244abec2e3c42219bb" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/illuminate\/container\/zipball\/78cbe88cdc7300efd4cf90244abec2e3c42219bb", + "reference": "78cbe88cdc7300efd4cf90244abec2e3c42219bb", + "shasum": "" + }, + "require": { + "illuminate\/contracts": "^11.0", + "php": "^8.2", + "psr\/container": "^1.1.1|^2.0.1" + }, + "provide": { + "psr\/container-implementation": "1.1|2.0" + }, + "time": "2023-09-15T13:17:41+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Illuminate\\Container\\": "" + } + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https:\/\/laravel.com", + "support": { + "issues": "https:\/\/github.com\/laravel\/framework\/issues", + "source": "https:\/\/github.com\/laravel\/framework" + }, + "install-path": "..\/illuminate\/container" + }, + { + "name": "illuminate\/contracts", + "version": "v11.0.7", + "version_normalized": "11.0.7.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/illuminate\/contracts.git", + "reference": "fae548ad43f569fc506f40385b2e0dcf1f4eb2c9" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/illuminate\/contracts\/zipball\/fae548ad43f569fc506f40385b2e0dcf1f4eb2c9", + "reference": "fae548ad43f569fc506f40385b2e0dcf1f4eb2c9", + "shasum": "" + }, + "require": { + "php": "^8.2", + "psr\/container": "^1.1.1|^2.0.1", + "psr\/simple-cache": "^1.0|^2.0|^3.0" + }, + "time": "2024-02-23T15:52:10+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https:\/\/laravel.com", + "support": { + "issues": "https:\/\/github.com\/laravel\/framework\/issues", + "source": "https:\/\/github.com\/laravel\/framework" + }, + "install-path": "..\/illuminate\/contracts" + }, + { + "name": "nette\/finder", + "version": "v2.6.0", + "version_normalized": "2.6.0.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/nette\/finder.git", + "reference": "991aefb42860abeab8e003970c3809a9d83cb932" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/nette\/finder\/zipball\/991aefb42860abeab8e003970c3809a9d83cb932", + "reference": "991aefb42860abeab8e003970c3809a9d83cb932", + "shasum": "" + }, + "require": { + "nette\/utils": "^2.4 || ^3.0", + "php": ">=7.1" + }, + "conflict": { + "nette\/nette": "<2.2" + }, + "require-dev": { + "nette\/tester": "^2.0", + "phpstan\/phpstan": "^0.12", + "tracy\/tracy": "^2.3" + }, + "time": "2022-10-13T01:31:15+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + }, + "installation-source": "dist", + "autoload": { + "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": "\ud83d\udd0d Nette Finder: find files and directories with an intuitive API.", + "homepage": "https:\/\/nette.org", + "keywords": [ + "filesystem", + "glob", + "iterator", + "nette" + ], + "support": { + "issues": "https:\/\/github.com\/nette\/finder\/issues", + "source": "https:\/\/github.com\/nette\/finder\/tree\/v2.6.0" + }, + "install-path": "..\/nette\/finder" + }, + { + "name": "nette\/robot-loader", + "version": "v3.4.2", + "version_normalized": "3.4.2.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/nette\/robot-loader.git", + "reference": "970c8f82be98ec54180c88a468cd2b057855d993" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/nette\/robot-loader\/zipball\/970c8f82be98ec54180c88a468cd2b057855d993", + "reference": "970c8f82be98ec54180c88a468cd2b057855d993", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "nette\/finder": "^2.5 || ^3.0", + "nette\/utils": "^3.0", + "php": ">=7.1" + }, + "require-dev": { + "nette\/tester": "^2.0", + "phpstan\/phpstan": "^0.12", + "tracy\/tracy": "^2.3" + }, + "time": "2022-12-14T15:41:06+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "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": "\ud83c\udf40 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.", + "homepage": "https:\/\/nette.org", + "keywords": [ + "autoload", + "class", + "interface", + "nette", + "trait" + ], + "support": { + "issues": "https:\/\/github.com\/nette\/robot-loader\/issues", + "source": "https:\/\/github.com\/nette\/robot-loader\/tree\/v3.4.2" + }, + "install-path": "..\/nette\/robot-loader" + }, + { + "name": "nette\/utils", + "version": "v3.2.10", + "version_normalized": "3.2.10.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/nette\/utils.git", + "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/nette\/utils\/zipball\/a4175c62652f2300c8017fb7e640f9ccb11648d2", + "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.4" + }, + "conflict": { + "nette\/di": "<3.0.6" + }, + "require-dev": { + "jetbrains\/phpstorm-attributes": "dev-master", + "nette\/tester": "~2.0", + "phpstan\/phpstan": "^1.0", + "tracy\/tracy": "^2.3" + }, + "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()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "time": "2023-07-30T15:38:18+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "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": "\ud83d\udee0 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\/v3.2.10" + }, + "install-path": "..\/nette\/utils" + }, + { + "name": "psr\/container", + "version": "2.0.2", + "version_normalized": "2.0.2.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/php-fig\/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/php-fig\/container\/zipball\/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "time": "2021-11-05T16:47:00+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Psr\\Container\\": "src\/" + } + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https:\/\/www.php-fig.org\/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https:\/\/github.com\/php-fig\/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https:\/\/github.com\/php-fig\/container\/issues", + "source": "https:\/\/github.com\/php-fig\/container\/tree\/2.0.2" + }, + "install-path": "..\/psr\/container" + }, + { + "name": "psr\/simple-cache", + "version": "3.0.0", + "version_normalized": "3.0.0.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/php-fig\/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/php-fig\/simple-cache\/zipball\/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "time": "2021-10-29T13:26:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Psr\\SimpleCache\\": "src\/" + } + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https:\/\/www.php-fig.org\/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https:\/\/github.com\/php-fig\/simple-cache\/tree\/3.0.0" + }, + "install-path": "..\/psr\/simple-cache" + }, + { + "name": "sebastian\/diff", + "version": "6.0.1", + "version_normalized": "6.0.1.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/sebastianbergmann\/diff.git", + "reference": "ab83243ecc233de5655b76f577711de9f842e712" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/sebastianbergmann\/diff\/zipball\/ab83243ecc233de5655b76f577711de9f842e712", + "reference": "ab83243ecc233de5655b76f577711de9f842e712", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit\/phpunit": "^11.0", + "symfony\/process": "^4.2 || ^5" + }, + "time": "2024-03-02T07:30:33+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" + }, + { + "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\/6.0.1" + }, + "funding": [ + { + "url": "https:\/\/github.com\/sebastianbergmann", + "type": "github" + } + ], + "install-path": "..\/sebastian\/diff" + }, + { + "name": "symfony\/console", + "version": "v6.4.4", + "version_normalized": "6.4.4.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symfony\/console.git", + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symfony\/console\/zipball\/0d9e4eb5ad413075624378f474c4167ea202de78", + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony\/deprecation-contracts": "^2.5|^3", + "symfony\/polyfill-mbstring": "~1.0", + "symfony\/service-contracts": "^2.5|^3", + "symfony\/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony\/dependency-injection": "<5.4", + "symfony\/dotenv": "<5.4", + "symfony\/event-dispatcher": "<5.4", + "symfony\/lock": "<5.4", + "symfony\/process": "<5.4" + }, + "provide": { + "psr\/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr\/log": "^1|^2|^3", + "symfony\/config": "^5.4|^6.0|^7.0", + "symfony\/dependency-injection": "^5.4|^6.0|^7.0", + "symfony\/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony\/http-foundation": "^6.4|^7.0", + "symfony\/http-kernel": "^6.4|^7.0", + "symfony\/lock": "^5.4|^6.0|^7.0", + "symfony\/messenger": "^5.4|^6.0|^7.0", + "symfony\/process": "^5.4|^6.0|^7.0", + "symfony\/stopwatch": "^5.4|^6.0|^7.0", + "symfony\/var-dumper": "^5.4|^6.0|^7.0" + }, + "time": "2024-02-22T20:27:10+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "\/Tests\/" + ] + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https:\/\/symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https:\/\/github.com\/symfony\/console\/tree\/v6.4.4" + }, + "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" + } + ], + "install-path": "..\/symfony\/console" + }, + { + "name": "symfony\/deprecation-contracts", + "version": "v3.4.0", + "version_normalized": "3.4.0.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symfony\/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symfony\/deprecation-contracts\/zipball\/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "time": "2023-05-23T14:45:45+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony\/contracts", + "url": "https:\/\/github.com\/symfony\/contracts" + } + }, + "installation-source": "dist", + "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.4.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" + } + ], + "install-path": "..\/symfony\/deprecation-contracts" + }, + { + "name": "symfony\/filesystem", + "version": "v6.4.3", + "version_normalized": "6.4.3.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symfony\/filesystem.git", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symfony\/filesystem\/zipball\/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony\/polyfill-ctype": "~1.8", + "symfony\/polyfill-mbstring": "~1.8" + }, + "time": "2024-01-23T14:51:35+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "\/Tests\/" + ] + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https:\/\/symfony.com", + "support": { + "source": "https:\/\/github.com\/symfony\/filesystem\/tree\/v6.4.3" + }, + "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" + } + ], + "install-path": "..\/symfony\/filesystem" + }, + { + "name": "symfony\/polyfill-ctype", + "version": "v1.29.0", + "version_normalized": "1.29.0.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symfony\/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-ctype\/zipball\/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "time": "2024-01-29T20:11:03+00:00", + "type": "library", + "extra": { + "thanks": { + "name": "symfony\/polyfill", + "url": "https:\/\/github.com\/symfony\/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https:\/\/symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https:\/\/github.com\/symfony\/polyfill-ctype\/tree\/v1.29.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" + } + ], + "install-path": "..\/symfony\/polyfill-ctype" + }, + { + "name": "symfony\/polyfill-intl-grapheme", + "version": "v1.29.0", + "version_normalized": "1.29.0.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symfony\/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-grapheme\/zipball\/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2024-01-29T20:11:03+00:00", + "type": "library", + "extra": { + "thanks": { + "name": "symfony\/polyfill", + "url": "https:\/\/github.com\/symfony\/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "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": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https:\/\/symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https:\/\/github.com\/symfony\/polyfill-intl-grapheme\/tree\/v1.29.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" + } + ], + "install-path": "..\/symfony\/polyfill-intl-grapheme" + }, + { + "name": "symfony\/polyfill-intl-normalizer", + "version": "v1.29.0", + "version_normalized": "1.29.0.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symfony\/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-normalizer\/zipball\/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2024-01-29T20:11:03+00:00", + "type": "library", + "extra": { + "thanks": { + "name": "symfony\/polyfill", + "url": "https:\/\/github.com\/symfony\/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources\/stubs" + ] + }, + "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": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https:\/\/symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https:\/\/github.com\/symfony\/polyfill-intl-normalizer\/tree\/v1.29.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" + } + ], + "install-path": "..\/symfony\/polyfill-intl-normalizer" + }, + { + "name": "symfony\/polyfill-mbstring", + "version": "v1.29.0", + "version_normalized": "1.29.0.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symfony\/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-mbstring\/zipball\/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "time": "2024-01-29T20:11:03+00:00", + "type": "library", + "extra": { + "thanks": { + "name": "symfony\/polyfill", + "url": "https:\/\/github.com\/symfony\/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "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": "Symfony polyfill for the Mbstring extension", + "homepage": "https:\/\/symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https:\/\/github.com\/symfony\/polyfill-mbstring\/tree\/v1.29.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" + } + ], + "install-path": "..\/symfony\/polyfill-mbstring" + }, + { + "name": "symfony\/service-contracts", + "version": "v3.4.1", + "version_normalized": "3.4.1.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symfony\/service-contracts.git", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symfony\/service-contracts\/zipball\/fe07cbc8d837f60caf7018068e350cc5163681a0", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr\/container": "^1.1|^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "time": "2023-12-26T14:02:43+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony\/contracts", + "url": "https:\/\/github.com\/symfony\/contracts" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "\/Test\/" + ] + }, + "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": "Generic abstractions related to writing services", + "homepage": "https:\/\/symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https:\/\/github.com\/symfony\/service-contracts\/tree\/v3.4.1" + }, + "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" + } + ], + "install-path": "..\/symfony\/service-contracts" + }, + { + "name": "symfony\/string", + "version": "v7.0.4", + "version_normalized": "7.0.4.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symfony\/string.git", + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symfony\/string\/zipball\/f5832521b998b0bec40bee688ad5de98d4cf111b", + "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony\/polyfill-ctype": "~1.8", + "symfony\/polyfill-intl-grapheme": "~1.0", + "symfony\/polyfill-intl-normalizer": "~1.0", + "symfony\/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony\/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony\/error-handler": "^6.4|^7.0", + "symfony\/http-client": "^6.4|^7.0", + "symfony\/intl": "^6.4|^7.0", + "symfony\/translation-contracts": "^2.5|^3.0", + "symfony\/var-exporter": "^6.4|^7.0" + }, + "time": "2024-02-01T13:17:36+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "Resources\/functions.php" + ], + "psr-4": { + "RuleDocGenerator202403\\Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "\/Tests\/" + ] + }, + "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": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https:\/\/symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https:\/\/github.com\/symfony\/string\/tree\/v7.0.4" + }, + "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" + } + ], + "install-path": "..\/symfony\/string" + }, + { + "name": "symfony\/yaml", + "version": "v6.4.3", + "version_normalized": "6.4.3.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symfony\/yaml.git", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symfony\/yaml\/zipball\/d75715985f0f94f978e3a8fa42533e10db921b90", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony\/deprecation-contracts": "^2.5|^3", + "symfony\/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony\/console": "<5.4" + }, + "require-dev": { + "symfony\/console": "^5.4|^6.0|^7.0" + }, + "time": "2024-01-23T14:51:35+00:00", + "bin": [ + "Resources\/bin\/yaml-lint" + ], + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "\/Tests\/" + ] + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https:\/\/symfony.com", + "support": { + "source": "https:\/\/github.com\/symfony\/yaml\/tree\/v6.4.3" + }, + "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" + } + ], + "install-path": "..\/symfony\/yaml" + }, + { + "name": "symplify\/rule-doc-generator-contracts", + "version": "11.1.26", + "version_normalized": "11.1.26.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/symplify\/rule-doc-generator-contracts.git", + "reference": "3e66b3fec678b74a076395ec629d535fb95293b5" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/symplify\/rule-doc-generator-contracts\/zipball\/3e66b3fec678b74a076395ec629d535fb95293b5", + "reference": "3e66b3fec678b74a076395ec629d535fb95293b5", + "shasum": "" + }, + "require": { + "nette\/utils": "^3.2", + "php": ">=8.1" + }, + "require-dev": { + "php-parallel-lint\/php-parallel-lint": "^1.3", + "phpstan\/extension-installer": "^1.2", + "rector\/rector": "^0.15.10", + "symplify\/easy-ci": "^11.1", + "symplify\/easy-coding-standard": "^11.1", + "symplify\/easy-testing": "^11.1", + "symplify\/phpstan-extensions": "^11.1", + "symplify\/phpstan-rules": "11.2.3.72", + "tomasvotruba\/unused-public": "^0.0.34" + }, + "time": "2023-02-07T07:16:13+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symplify\\RuleDocGenerator\\": "src" + } + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "description": "Contracts for production code of RuleDocGenerator", + "support": { + "source": "https:\/\/github.com\/symplify\/rule-doc-generator-contracts\/tree\/11.1.26" + }, + "funding": [ + { + "url": "https:\/\/www.paypal.me\/rectorphp", + "type": "custom" + }, + { + "url": "https:\/\/github.com\/tomasvotruba", + "type": "github" + } + ], + "install-path": "..\/symplify\/rule-doc-generator-contracts" + }, + { + "name": "webmozart\/assert", + "version": "1.11.0", + "version_normalized": "1.11.0.0", + "source": { + "type": "git", + "url": "https:\/\/github.com\/webmozarts\/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https:\/\/api.github.com\/repos\/webmozarts\/assert\/zipball\/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan\/phpstan": "<0.12.20", + "vimeo\/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit\/phpunit": "^8.5.13" + }, + "time": "2022-06-03T18:03:27+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Webmozart\\Assert\\": "src\/" + } + }, + "notification-url": "https:\/\/packagist.org\/downloads\/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input\/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https:\/\/github.com\/webmozarts\/assert\/issues", + "source": "https:\/\/github.com\/webmozarts\/assert\/tree\/1.11.0" + }, + "install-path": "..\/webmozart\/assert" + } + ], + "dev": false, + "dev-package-names": [] +} \ No newline at end of file diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php new file mode 100644 index 00000000..e6e98f13 --- /dev/null +++ b/vendor/composer/installed.php @@ -0,0 +1,5 @@ + array('name' => 'symplify/rule-doc-generator', 'pretty_version' => '12.1.7', 'version' => '12.1.7.0', 'reference' => 'b9b0f607201826c181c8315feca07100c2c8a15c', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => \false), 'versions' => array('illuminate/container' => array('pretty_version' => 'v11.0.7', 'version' => '11.0.7.0', 'reference' => '78cbe88cdc7300efd4cf90244abec2e3c42219bb', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/container', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/contracts' => array('pretty_version' => 'v11.0.7', 'version' => '11.0.7.0', 'reference' => 'fae548ad43f569fc506f40385b2e0dcf1f4eb2c9', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/contracts', 'aliases' => array(), 'dev_requirement' => \false), 'nette/finder' => array('pretty_version' => 'v2.6.0', 'version' => '2.6.0.0', 'reference' => '991aefb42860abeab8e003970c3809a9d83cb932', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/finder', 'aliases' => array(), 'dev_requirement' => \false), 'nette/robot-loader' => array('pretty_version' => 'v3.4.2', 'version' => '3.4.2.0', 'reference' => '970c8f82be98ec54180c88a468cd2b057855d993', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/robot-loader', 'aliases' => array(), 'dev_requirement' => \false), 'nette/utils' => array('pretty_version' => 'v3.2.10', 'version' => '3.2.10.0', 'reference' => 'a4175c62652f2300c8017fb7e640f9ccb11648d2', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/utils', 'aliases' => array(), 'dev_requirement' => \false), 'psr/container' => array('pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/container', 'aliases' => array(), 'dev_requirement' => \false), 'psr/container-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.1|2.0')), 'psr/log-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0|2.0|3.0')), 'psr/simple-cache' => array('pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => '764e0b3939f5ca87cb904f570ef9be2d78a07865', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/simple-cache', 'aliases' => array(), 'dev_requirement' => \false), 'sebastian/diff' => array('pretty_version' => '6.0.1', 'version' => '6.0.1.0', 'reference' => 'ab83243ecc233de5655b76f577711de9f842e712', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/console' => array('pretty_version' => 'v6.4.4', 'version' => '6.4.4.0', 'reference' => '0d9e4eb5ad413075624378f474c4167ea202de78', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v3.4.0', 'version' => '3.4.0.0', 'reference' => '7c3aff79d10325257a001fcf92d991f24fc967cf', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/filesystem' => array('pretty_version' => 'v6.4.3', 'version' => '6.4.3.0', 'reference' => '7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-ctype' => array('pretty_version' => 'v1.29.0', 'version' => '1.29.0.0', 'reference' => 'ef4d7e442ca910c4764bce785146269b30cb5fc4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-intl-grapheme' => array('pretty_version' => 'v1.29.0', 'version' => '1.29.0.0', 'reference' => '32a9da87d7b3245e09ac426c83d334ae9f06f80f', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-intl-normalizer' => array('pretty_version' => 'v1.29.0', 'version' => '1.29.0.0', 'reference' => 'bc45c394692b948b4d383a08d7753968bed9a83d', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-mbstring' => array('pretty_version' => 'v1.29.0', 'version' => '1.29.0.0', 'reference' => '9773676c8a1bb1f8d4340a62efe641cf76eda7ec', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/service-contracts' => array('pretty_version' => 'v3.4.1', 'version' => '3.4.1.0', 'reference' => 'fe07cbc8d837f60caf7018068e350cc5163681a0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/string' => array('pretty_version' => 'v7.0.4', 'version' => '7.0.4.0', 'reference' => 'f5832521b998b0bec40bee688ad5de98d4cf111b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/yaml' => array('pretty_version' => 'v6.4.3', 'version' => '6.4.3.0', 'reference' => 'd75715985f0f94f978e3a8fa42533e10db921b90', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/rule-doc-generator' => array('pretty_version' => '12.1.7', 'version' => '12.1.7.0', 'reference' => 'b9b0f607201826c181c8315feca07100c2c8a15c', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/rule-doc-generator-contracts' => array('pretty_version' => '11.1.26', 'version' => '11.1.26.0', 'reference' => '3e66b3fec678b74a076395ec629d535fb95293b5', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/rule-doc-generator-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'webmozart/assert' => array('pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'dev_requirement' => \false))); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php new file mode 100644 index 00000000..d32d90c6 --- /dev/null +++ b/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 80200)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 8.2.0". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/vendor/illuminate/container/BoundMethod.php b/vendor/illuminate/container/BoundMethod.php new file mode 100644 index 00000000..312f405c --- /dev/null +++ b/vendor/illuminate/container/BoundMethod.php @@ -0,0 +1,170 @@ +make($segments[0]), $method], $parameters); + } + /** + * Call a method that has been bound to the container. + * + * @param \Illuminate\Container\Container $container + * @param callable $callback + * @param mixed $default + * @return mixed + */ + protected static function callBoundMethod($container, $callback, $default) + { + if (!\is_array($callback)) { + return Util::unwrapIfClosure($default); + } + // Here we need to turn the array callable into a Class@method string we can use to + // examine the container and see if there are any method bindings for this given + // method. If there are, we can call this method binding callback immediately. + $method = static::normalizeMethod($callback); + if ($container->hasMethodBinding($method)) { + return $container->callMethodBinding($method, $callback[0]); + } + return Util::unwrapIfClosure($default); + } + /** + * Normalize the given callback into a Class@method string. + * + * @param callable $callback + * @return string + */ + protected static function normalizeMethod($callback) + { + $class = \is_string($callback[0]) ? $callback[0] : \get_class($callback[0]); + return "{$class}@{$callback[1]}"; + } + /** + * Get all dependencies for a given method. + * + * @param \Illuminate\Container\Container $container + * @param callable|string $callback + * @param array $parameters + * @return array + * + * @throws \ReflectionException + */ + protected static function getMethodDependencies($container, $callback, array $parameters = []) + { + $dependencies = []; + foreach (static::getCallReflector($callback)->getParameters() as $parameter) { + static::addDependencyForCallParameter($container, $parameter, $parameters, $dependencies); + } + return \array_merge($dependencies, \array_values($parameters)); + } + /** + * Get the proper reflection instance for the given callback. + * + * @param callable|string $callback + * @return \ReflectionFunctionAbstract + * + * @throws \ReflectionException + */ + protected static function getCallReflector($callback) + { + if (\is_string($callback) && \strpos($callback, '::') !== \false) { + $callback = \explode('::', $callback); + } elseif (\is_object($callback) && !$callback instanceof Closure) { + $callback = [$callback, '__invoke']; + } + return \is_array($callback) ? new ReflectionMethod($callback[0], $callback[1]) : new ReflectionFunction($callback); + } + /** + * Get the dependency for the given call parameter. + * + * @param \Illuminate\Container\Container $container + * @param \ReflectionParameter $parameter + * @param array $parameters + * @param array $dependencies + * @return void + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected static function addDependencyForCallParameter($container, $parameter, array &$parameters, &$dependencies) + { + if (\array_key_exists($paramName = $parameter->getName(), $parameters)) { + $dependencies[] = $parameters[$paramName]; + unset($parameters[$paramName]); + } elseif (!\is_null($className = Util::getParameterClassName($parameter))) { + if (\array_key_exists($className, $parameters)) { + $dependencies[] = $parameters[$className]; + unset($parameters[$className]); + } elseif ($parameter->isVariadic()) { + $variadicDependencies = $container->make($className); + $dependencies = \array_merge($dependencies, \is_array($variadicDependencies) ? $variadicDependencies : [$variadicDependencies]); + } else { + $dependencies[] = $container->make($className); + } + } elseif ($parameter->isDefaultValueAvailable()) { + $dependencies[] = $parameter->getDefaultValue(); + } elseif (!$parameter->isOptional() && !\array_key_exists($paramName, $parameters)) { + $message = "Unable to resolve dependency [{$parameter}] in class {$parameter->getDeclaringClass()->getName()}"; + throw new BindingResolutionException($message); + } + } + /** + * Determine if the given string is in Class@method syntax. + * + * @param mixed $callback + * @return bool + */ + protected static function isCallableWithAtSign($callback) + { + return \is_string($callback) && \strpos($callback, '@') !== \false; + } +} diff --git a/vendor/illuminate/container/Container.php b/vendor/illuminate/container/Container.php new file mode 100755 index 00000000..591ee372 --- /dev/null +++ b/vendor/illuminate/container/Container.php @@ -0,0 +1,1287 @@ +getAlias($c); + } + return new ContextualBindingBuilder($this, $aliases); + } + /** + * Determine if the given abstract type has been bound. + * + * @param string $abstract + * @return bool + */ + public function bound($abstract) + { + return isset($this->bindings[$abstract]) || isset($this->instances[$abstract]) || $this->isAlias($abstract); + } + /** + * {@inheritdoc} + * + * @return bool + */ + public function has(string $id) : bool + { + return $this->bound($id); + } + /** + * Determine if the given abstract type has been resolved. + * + * @param string $abstract + * @return bool + */ + public function resolved($abstract) + { + if ($this->isAlias($abstract)) { + $abstract = $this->getAlias($abstract); + } + return isset($this->resolved[$abstract]) || isset($this->instances[$abstract]); + } + /** + * Determine if a given type is shared. + * + * @param string $abstract + * @return bool + */ + public function isShared($abstract) + { + return isset($this->instances[$abstract]) || isset($this->bindings[$abstract]['shared']) && $this->bindings[$abstract]['shared'] === \true; + } + /** + * Determine if a given string is an alias. + * + * @param string $name + * @return bool + */ + public function isAlias($name) + { + return isset($this->aliases[$name]); + } + /** + * Register a binding with the container. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @param bool $shared + * @return void + * + * @throws \TypeError + */ + public function bind($abstract, $concrete = null, $shared = \false) + { + $this->dropStaleInstances($abstract); + // If no concrete type was given, we will simply set the concrete type to the + // abstract type. After that, the concrete type to be registered as shared + // without being forced to state their classes in both of the parameters. + if (\is_null($concrete)) { + $concrete = $abstract; + } + // If the factory is not a Closure, it means it is just a class name which is + // bound into this container to the abstract type and we will just wrap it + // up inside its own Closure to give us more convenience when extending. + if (!$concrete instanceof Closure) { + if (!\is_string($concrete)) { + throw new TypeError(self::class . '::bind(): Argument #2 ($concrete) must be of type Closure|string|null'); + } + $concrete = $this->getClosure($abstract, $concrete); + } + $this->bindings[$abstract] = \compact('concrete', 'shared'); + // If the abstract type was already resolved in this container we'll fire the + // rebound listener so that any objects which have already gotten resolved + // can have their copy of the object updated via the listener callbacks. + if ($this->resolved($abstract)) { + $this->rebound($abstract); + } + } + /** + * Get the Closure to be used when building a type. + * + * @param string $abstract + * @param string $concrete + * @return \Closure + */ + protected function getClosure($abstract, $concrete) + { + return function ($container, $parameters = []) use($abstract, $concrete) { + if ($abstract == $concrete) { + return $container->build($concrete); + } + return $container->resolve($concrete, $parameters, $raiseEvents = \false); + }; + } + /** + * Determine if the container has a method binding. + * + * @param string $method + * @return bool + */ + public function hasMethodBinding($method) + { + return isset($this->methodBindings[$method]); + } + /** + * Bind a callback to resolve with Container::call. + * + * @param array|string $method + * @param \Closure $callback + * @return void + */ + public function bindMethod($method, $callback) + { + $this->methodBindings[$this->parseBindMethod($method)] = $callback; + } + /** + * Get the method to be bound in class@method format. + * + * @param array|string $method + * @return string + */ + protected function parseBindMethod($method) + { + if (\is_array($method)) { + return $method[0] . '@' . $method[1]; + } + return $method; + } + /** + * Get the method binding for the given method. + * + * @param string $method + * @param mixed $instance + * @return mixed + */ + public function callMethodBinding($method, $instance) + { + return \call_user_func($this->methodBindings[$method], $instance, $this); + } + /** + * Add a contextual binding to the container. + * + * @param string $concrete + * @param string $abstract + * @param \Closure|string $implementation + * @return void + */ + public function addContextualBinding($concrete, $abstract, $implementation) + { + $this->contextual[$concrete][$this->getAlias($abstract)] = $implementation; + } + /** + * Register a binding if it hasn't already been registered. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @param bool $shared + * @return void + */ + public function bindIf($abstract, $concrete = null, $shared = \false) + { + if (!$this->bound($abstract)) { + $this->bind($abstract, $concrete, $shared); + } + } + /** + * Register a shared binding in the container. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function singleton($abstract, $concrete = null) + { + $this->bind($abstract, $concrete, \true); + } + /** + * Register a shared binding if it hasn't already been registered. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function singletonIf($abstract, $concrete = null) + { + if (!$this->bound($abstract)) { + $this->singleton($abstract, $concrete); + } + } + /** + * Register a scoped binding in the container. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function scoped($abstract, $concrete = null) + { + $this->scopedInstances[] = $abstract; + $this->singleton($abstract, $concrete); + } + /** + * Register a scoped binding if it hasn't already been registered. + * + * @param string $abstract + * @param \Closure|string|null $concrete + * @return void + */ + public function scopedIf($abstract, $concrete = null) + { + if (!$this->bound($abstract)) { + $this->scoped($abstract, $concrete); + } + } + /** + * "Extend" an abstract type in the container. + * + * @param string $abstract + * @param \Closure $closure + * @return void + * + * @throws \InvalidArgumentException + */ + public function extend($abstract, Closure $closure) + { + $abstract = $this->getAlias($abstract); + if (isset($this->instances[$abstract])) { + $this->instances[$abstract] = $closure($this->instances[$abstract], $this); + $this->rebound($abstract); + } else { + $this->extenders[$abstract][] = $closure; + if ($this->resolved($abstract)) { + $this->rebound($abstract); + } + } + } + /** + * Register an existing instance as shared in the container. + * + * @param string $abstract + * @param mixed $instance + * @return mixed + */ + public function instance($abstract, $instance) + { + $this->removeAbstractAlias($abstract); + $isBound = $this->bound($abstract); + unset($this->aliases[$abstract]); + // We'll check to determine if this type has been bound before, and if it has + // we will fire the rebound callbacks registered with the container and it + // can be updated with consuming classes that have gotten resolved here. + $this->instances[$abstract] = $instance; + if ($isBound) { + $this->rebound($abstract); + } + return $instance; + } + /** + * Remove an alias from the contextual binding alias cache. + * + * @param string $searched + * @return void + */ + protected function removeAbstractAlias($searched) + { + if (!isset($this->aliases[$searched])) { + return; + } + foreach ($this->abstractAliases as $abstract => $aliases) { + foreach ($aliases as $index => $alias) { + if ($alias == $searched) { + unset($this->abstractAliases[$abstract][$index]); + } + } + } + } + /** + * Assign a set of tags to a given binding. + * + * @param array|string $abstracts + * @param array|mixed ...$tags + * @return void + */ + public function tag($abstracts, $tags) + { + $tags = \is_array($tags) ? $tags : \array_slice(\func_get_args(), 1); + foreach ($tags as $tag) { + if (!isset($this->tags[$tag])) { + $this->tags[$tag] = []; + } + foreach ((array) $abstracts as $abstract) { + $this->tags[$tag][] = $abstract; + } + } + } + /** + * Resolve all of the bindings for a given tag. + * + * @param string $tag + * @return iterable + */ + public function tagged($tag) + { + if (!isset($this->tags[$tag])) { + return []; + } + return new RewindableGenerator(function () use($tag) { + foreach ($this->tags[$tag] as $abstract) { + (yield $this->make($abstract)); + } + }, \count($this->tags[$tag])); + } + /** + * Alias a type to a different name. + * + * @param string $abstract + * @param string $alias + * @return void + * + * @throws \LogicException + */ + public function alias($abstract, $alias) + { + if ($alias === $abstract) { + throw new LogicException("[{$abstract}] is aliased to itself."); + } + $this->aliases[$alias] = $abstract; + $this->abstractAliases[$abstract][] = $alias; + } + /** + * Bind a new callback to an abstract's rebind event. + * + * @param string $abstract + * @param \Closure $callback + * @return mixed + */ + public function rebinding($abstract, Closure $callback) + { + $this->reboundCallbacks[$abstract = $this->getAlias($abstract)][] = $callback; + if ($this->bound($abstract)) { + return $this->make($abstract); + } + } + /** + * Refresh an instance on the given target and method. + * + * @param string $abstract + * @param mixed $target + * @param string $method + * @return mixed + */ + public function refresh($abstract, $target, $method) + { + return $this->rebinding($abstract, function ($app, $instance) use($target, $method) { + $target->{$method}($instance); + }); + } + /** + * Fire the "rebound" callbacks for the given abstract type. + * + * @param string $abstract + * @return void + */ + protected function rebound($abstract) + { + $instance = $this->make($abstract); + foreach ($this->getReboundCallbacks($abstract) as $callback) { + $callback($this, $instance); + } + } + /** + * Get the rebound callbacks for a given type. + * + * @param string $abstract + * @return array + */ + protected function getReboundCallbacks($abstract) + { + return $this->reboundCallbacks[$abstract] ?? []; + } + /** + * Wrap the given closure such that its dependencies will be injected when executed. + * + * @param \Closure $callback + * @param array $parameters + * @return \Closure + */ + public function wrap(Closure $callback, array $parameters = []) + { + return function () use($callback, $parameters) { + return $this->call($callback, $parameters); + }; + } + /** + * Call the given Closure / class@method and inject its dependencies. + * + * @param callable|string $callback + * @param array $parameters + * @param string|null $defaultMethod + * @return mixed + * + * @throws \InvalidArgumentException + */ + public function call($callback, array $parameters = [], $defaultMethod = null) + { + $pushedToBuildStack = \false; + if (($className = $this->getClassForCallable($callback)) && !\in_array($className, $this->buildStack, \true)) { + $this->buildStack[] = $className; + $pushedToBuildStack = \true; + } + $result = BoundMethod::call($this, $callback, $parameters, $defaultMethod); + if ($pushedToBuildStack) { + \array_pop($this->buildStack); + } + return $result; + } + /** + * Get the class name for the given callback, if one can be determined. + * + * @param callable|string $callback + * @return string|false + */ + protected function getClassForCallable($callback) + { + if (\is_callable($callback) && !($reflector = new ReflectionFunction(\Closure::fromCallable($callback)))->isAnonymous()) { + return $reflector->getClosureScopeClass()->name ?? \false; + } + return \false; + } + /** + * Get a closure to resolve the given type from the container. + * + * @param string $abstract + * @return \Closure + */ + public function factory($abstract) + { + return function () use($abstract) { + return $this->make($abstract); + }; + } + /** + * An alias function name for make(). + * + * @param string|callable $abstract + * @param array $parameters + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + public function makeWith($abstract, array $parameters = []) + { + return $this->make($abstract, $parameters); + } + /** + * Resolve the given type from the container. + * + * @param string|callable $abstract + * @param array $parameters + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + public function make($abstract, array $parameters = []) + { + return $this->resolve($abstract, $parameters); + } + /** + * {@inheritdoc} + * + * @return mixed + */ + public function get(string $id) + { + try { + return $this->resolve($id); + } catch (Exception $e) { + if ($this->has($id) || $e instanceof CircularDependencyException) { + throw $e; + } + throw new EntryNotFoundException($id, \is_int($e->getCode()) ? $e->getCode() : 0, $e); + } + } + /** + * Resolve the given type from the container. + * + * @param string|callable $abstract + * @param array $parameters + * @param bool $raiseEvents + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @throws \Illuminate\Contracts\Container\CircularDependencyException + */ + protected function resolve($abstract, $parameters = [], $raiseEvents = \true) + { + $abstract = $this->getAlias($abstract); + // First we'll fire any event handlers which handle the "before" resolving of + // specific types. This gives some hooks the chance to add various extends + // calls to change the resolution of objects that they're interested in. + if ($raiseEvents) { + $this->fireBeforeResolvingCallbacks($abstract, $parameters); + } + $concrete = $this->getContextualConcrete($abstract); + $needsContextualBuild = !empty($parameters) || !\is_null($concrete); + // If an instance of the type is currently being managed as a singleton we'll + // just return an existing instance instead of instantiating new instances + // so the developer can keep using the same objects instance every time. + if (isset($this->instances[$abstract]) && !$needsContextualBuild) { + return $this->instances[$abstract]; + } + $this->with[] = $parameters; + if (\is_null($concrete)) { + $concrete = $this->getConcrete($abstract); + } + // We're ready to instantiate an instance of the concrete type registered for + // the binding. This will instantiate the types, as well as resolve any of + // its "nested" dependencies recursively until all have gotten resolved. + $object = $this->isBuildable($concrete, $abstract) ? $this->build($concrete) : $this->make($concrete); + // If we defined any extenders for this type, we'll need to spin through them + // and apply them to the object being built. This allows for the extension + // of services, such as changing configuration or decorating the object. + foreach ($this->getExtenders($abstract) as $extender) { + $object = $extender($object, $this); + } + // If the requested type is registered as a singleton we'll want to cache off + // the instances in "memory" so we can return it later without creating an + // entirely new instance of an object on each subsequent request for it. + if ($this->isShared($abstract) && !$needsContextualBuild) { + $this->instances[$abstract] = $object; + } + if ($raiseEvents) { + $this->fireResolvingCallbacks($abstract, $object); + } + // Before returning, we will also set the resolved flag to "true" and pop off + // the parameter overrides for this build. After those two things are done + // we will be ready to return back the fully constructed class instance. + $this->resolved[$abstract] = \true; + \array_pop($this->with); + return $object; + } + /** + * Get the concrete type for a given abstract. + * + * @param string|callable $abstract + * @return mixed + */ + protected function getConcrete($abstract) + { + // If we don't have a registered resolver or concrete for the type, we'll just + // assume each type is a concrete name and will attempt to resolve it as is + // since the container should be able to resolve concretes automatically. + if (isset($this->bindings[$abstract])) { + return $this->bindings[$abstract]['concrete']; + } + return $abstract; + } + /** + * Get the contextual concrete binding for the given abstract. + * + * @param string|callable $abstract + * @return \Closure|string|array|null + */ + protected function getContextualConcrete($abstract) + { + if (!\is_null($binding = $this->findInContextualBindings($abstract))) { + return $binding; + } + // Next we need to see if a contextual binding might be bound under an alias of the + // given abstract type. So, we will need to check if any aliases exist with this + // type and then spin through them and check for contextual bindings on these. + if (empty($this->abstractAliases[$abstract])) { + return; + } + foreach ($this->abstractAliases[$abstract] as $alias) { + if (!\is_null($binding = $this->findInContextualBindings($alias))) { + return $binding; + } + } + } + /** + * Find the concrete binding for the given abstract in the contextual binding array. + * + * @param string|callable $abstract + * @return \Closure|string|null + */ + protected function findInContextualBindings($abstract) + { + return $this->contextual[\end($this->buildStack)][$abstract] ?? null; + } + /** + * Determine if the given concrete is buildable. + * + * @param mixed $concrete + * @param string $abstract + * @return bool + */ + protected function isBuildable($concrete, $abstract) + { + return $concrete === $abstract || $concrete instanceof Closure; + } + /** + * Instantiate a concrete instance of the given type. + * + * @param \Closure|string $concrete + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + * @throws \Illuminate\Contracts\Container\CircularDependencyException + */ + public function build($concrete) + { + // If the concrete type is actually a Closure, we will just execute it and + // hand back the results of the functions, which allows functions to be + // used as resolvers for more fine-tuned resolution of these objects. + if ($concrete instanceof Closure) { + return $concrete($this, $this->getLastParameterOverride()); + } + try { + $reflector = new ReflectionClass($concrete); + } catch (ReflectionException $e) { + throw new BindingResolutionException("Target class [{$concrete}] does not exist.", 0, $e); + } + // If the type is not instantiable, the developer is attempting to resolve + // an abstract type such as an Interface or Abstract Class and there is + // no binding registered for the abstractions so we need to bail out. + if (!$reflector->isInstantiable()) { + return $this->notInstantiable($concrete); + } + $this->buildStack[] = $concrete; + $constructor = $reflector->getConstructor(); + // If there are no constructors, that means there are no dependencies then + // we can just resolve the instances of the objects right away, without + // resolving any other types or dependencies out of these containers. + if (\is_null($constructor)) { + \array_pop($this->buildStack); + return new $concrete(); + } + $dependencies = $constructor->getParameters(); + // Once we have all the constructor's parameters we can create each of the + // dependency instances and then use the reflection instances to make a + // new instance of this class, injecting the created dependencies in. + try { + $instances = $this->resolveDependencies($dependencies); + } catch (BindingResolutionException $e) { + \array_pop($this->buildStack); + throw $e; + } + \array_pop($this->buildStack); + return $reflector->newInstanceArgs($instances); + } + /** + * Resolve all of the dependencies from the ReflectionParameters. + * + * @param \ReflectionParameter[] $dependencies + * @return array + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function resolveDependencies(array $dependencies) + { + $results = []; + foreach ($dependencies as $dependency) { + // If the dependency has an override for this particular build we will use + // that instead as the value. Otherwise, we will continue with this run + // of resolutions and let reflection attempt to determine the result. + if ($this->hasParameterOverride($dependency)) { + $results[] = $this->getParameterOverride($dependency); + continue; + } + // If the class is null, it means the dependency is a string or some other + // primitive type which we can not resolve since it is not a class and + // we will just bomb out with an error since we have no-where to go. + $result = \is_null(Util::getParameterClassName($dependency)) ? $this->resolvePrimitive($dependency) : $this->resolveClass($dependency); + if ($dependency->isVariadic()) { + $results = \array_merge($results, $result); + } else { + $results[] = $result; + } + } + return $results; + } + /** + * Determine if the given dependency has a parameter override. + * + * @param \ReflectionParameter $dependency + * @return bool + */ + protected function hasParameterOverride($dependency) + { + return \array_key_exists($dependency->name, $this->getLastParameterOverride()); + } + /** + * Get a parameter override for a dependency. + * + * @param \ReflectionParameter $dependency + * @return mixed + */ + protected function getParameterOverride($dependency) + { + return $this->getLastParameterOverride()[$dependency->name]; + } + /** + * Get the last parameter override. + * + * @return array + */ + protected function getLastParameterOverride() + { + return \count($this->with) ? \end($this->with) : []; + } + /** + * Resolve a non-class hinted primitive dependency. + * + * @param \ReflectionParameter $parameter + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function resolvePrimitive(ReflectionParameter $parameter) + { + if (!\is_null($concrete = $this->getContextualConcrete('$' . $parameter->getName()))) { + return Util::unwrapIfClosure($concrete, $this); + } + if ($parameter->isDefaultValueAvailable()) { + return $parameter->getDefaultValue(); + } + if ($parameter->isVariadic()) { + return []; + } + $this->unresolvablePrimitive($parameter); + } + /** + * Resolve a class based dependency from the container. + * + * @param \ReflectionParameter $parameter + * @return mixed + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function resolveClass(ReflectionParameter $parameter) + { + try { + return $parameter->isVariadic() ? $this->resolveVariadicClass($parameter) : $this->make(Util::getParameterClassName($parameter)); + } catch (BindingResolutionException $e) { + if ($parameter->isDefaultValueAvailable()) { + \array_pop($this->with); + return $parameter->getDefaultValue(); + } + if ($parameter->isVariadic()) { + \array_pop($this->with); + return []; + } + throw $e; + } + } + /** + * Resolve a class based variadic dependency from the container. + * + * @param \ReflectionParameter $parameter + * @return mixed + */ + protected function resolveVariadicClass(ReflectionParameter $parameter) + { + $className = Util::getParameterClassName($parameter); + $abstract = $this->getAlias($className); + if (!\is_array($concrete = $this->getContextualConcrete($abstract))) { + return $this->make($className); + } + return \array_map(function ($abstract) { + return $this->resolve($abstract); + }, $concrete); + } + /** + * Throw an exception that the concrete is not instantiable. + * + * @param string $concrete + * @return void + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function notInstantiable($concrete) + { + if (!empty($this->buildStack)) { + $previous = \implode(', ', $this->buildStack); + $message = "Target [{$concrete}] is not instantiable while building [{$previous}]."; + } else { + $message = "Target [{$concrete}] is not instantiable."; + } + throw new BindingResolutionException($message); + } + /** + * Throw an exception for an unresolvable primitive. + * + * @param \ReflectionParameter $parameter + * @return void + * + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + protected function unresolvablePrimitive(ReflectionParameter $parameter) + { + $message = "Unresolvable dependency resolving [{$parameter}] in class {$parameter->getDeclaringClass()->getName()}"; + throw new BindingResolutionException($message); + } + /** + * Register a new before resolving callback for all types. + * + * @param \Closure|string $abstract + * @param \Closure|null $callback + * @return void + */ + public function beforeResolving($abstract, Closure $callback = null) + { + if (\is_string($abstract)) { + $abstract = $this->getAlias($abstract); + } + if ($abstract instanceof Closure && \is_null($callback)) { + $this->globalBeforeResolvingCallbacks[] = $abstract; + } else { + $this->beforeResolvingCallbacks[$abstract][] = $callback; + } + } + /** + * Register a new resolving callback. + * + * @param \Closure|string $abstract + * @param \Closure|null $callback + * @return void + */ + public function resolving($abstract, Closure $callback = null) + { + if (\is_string($abstract)) { + $abstract = $this->getAlias($abstract); + } + if (\is_null($callback) && $abstract instanceof Closure) { + $this->globalResolvingCallbacks[] = $abstract; + } else { + $this->resolvingCallbacks[$abstract][] = $callback; + } + } + /** + * Register a new after resolving callback for all types. + * + * @param \Closure|string $abstract + * @param \Closure|null $callback + * @return void + */ + public function afterResolving($abstract, Closure $callback = null) + { + if (\is_string($abstract)) { + $abstract = $this->getAlias($abstract); + } + if ($abstract instanceof Closure && \is_null($callback)) { + $this->globalAfterResolvingCallbacks[] = $abstract; + } else { + $this->afterResolvingCallbacks[$abstract][] = $callback; + } + } + /** + * Fire all of the before resolving callbacks. + * + * @param string $abstract + * @param array $parameters + * @return void + */ + protected function fireBeforeResolvingCallbacks($abstract, $parameters = []) + { + $this->fireBeforeCallbackArray($abstract, $parameters, $this->globalBeforeResolvingCallbacks); + foreach ($this->beforeResolvingCallbacks as $type => $callbacks) { + if ($type === $abstract || \is_subclass_of($abstract, $type)) { + $this->fireBeforeCallbackArray($abstract, $parameters, $callbacks); + } + } + } + /** + * Fire an array of callbacks with an object. + * + * @param string $abstract + * @param array $parameters + * @param array $callbacks + * @return void + */ + protected function fireBeforeCallbackArray($abstract, $parameters, array $callbacks) + { + foreach ($callbacks as $callback) { + $callback($abstract, $parameters, $this); + } + } + /** + * Fire all of the resolving callbacks. + * + * @param string $abstract + * @param mixed $object + * @return void + */ + protected function fireResolvingCallbacks($abstract, $object) + { + $this->fireCallbackArray($object, $this->globalResolvingCallbacks); + $this->fireCallbackArray($object, $this->getCallbacksForType($abstract, $object, $this->resolvingCallbacks)); + $this->fireAfterResolvingCallbacks($abstract, $object); + } + /** + * Fire all of the after resolving callbacks. + * + * @param string $abstract + * @param mixed $object + * @return void + */ + protected function fireAfterResolvingCallbacks($abstract, $object) + { + $this->fireCallbackArray($object, $this->globalAfterResolvingCallbacks); + $this->fireCallbackArray($object, $this->getCallbacksForType($abstract, $object, $this->afterResolvingCallbacks)); + } + /** + * Get all callbacks for a given type. + * + * @param string $abstract + * @param object $object + * @param array $callbacksPerType + * @return array + */ + protected function getCallbacksForType($abstract, $object, array $callbacksPerType) + { + $results = []; + foreach ($callbacksPerType as $type => $callbacks) { + if ($type === $abstract || $object instanceof $type) { + $results = \array_merge($results, $callbacks); + } + } + return $results; + } + /** + * Fire an array of callbacks with an object. + * + * @param mixed $object + * @param array $callbacks + * @return void + */ + protected function fireCallbackArray($object, array $callbacks) + { + foreach ($callbacks as $callback) { + $callback($object, $this); + } + } + /** + * Get the container's bindings. + * + * @return array + */ + public function getBindings() + { + return $this->bindings; + } + /** + * Get the alias for an abstract if available. + * + * @param string $abstract + * @return string + */ + public function getAlias($abstract) + { + return isset($this->aliases[$abstract]) ? $this->getAlias($this->aliases[$abstract]) : $abstract; + } + /** + * Get the extender callbacks for a given type. + * + * @param string $abstract + * @return array + */ + protected function getExtenders($abstract) + { + return $this->extenders[$this->getAlias($abstract)] ?? []; + } + /** + * Remove all of the extender callbacks for a given type. + * + * @param string $abstract + * @return void + */ + public function forgetExtenders($abstract) + { + unset($this->extenders[$this->getAlias($abstract)]); + } + /** + * Drop all of the stale instances and aliases. + * + * @param string $abstract + * @return void + */ + protected function dropStaleInstances($abstract) + { + unset($this->instances[$abstract], $this->aliases[$abstract]); + } + /** + * Remove a resolved instance from the instance cache. + * + * @param string $abstract + * @return void + */ + public function forgetInstance($abstract) + { + unset($this->instances[$abstract]); + } + /** + * Clear all of the instances from the container. + * + * @return void + */ + public function forgetInstances() + { + $this->instances = []; + } + /** + * Clear all of the scoped instances from the container. + * + * @return void + */ + public function forgetScopedInstances() + { + foreach ($this->scopedInstances as $scoped) { + unset($this->instances[$scoped]); + } + } + /** + * Flush the container of all bindings and resolved instances. + * + * @return void + */ + public function flush() + { + $this->aliases = []; + $this->resolved = []; + $this->bindings = []; + $this->instances = []; + $this->abstractAliases = []; + $this->scopedInstances = []; + } + /** + * Get the globally available instance of the container. + * + * @return static + */ + public static function getInstance() + { + if (\is_null(static::$instance)) { + static::$instance = new static(); + } + return static::$instance; + } + /** + * Set the shared instance of the container. + * + * @param \Illuminate\Contracts\Container\Container|null $container + * @return \Illuminate\Contracts\Container\Container|static + */ + public static function setInstance(ContainerContract $container = null) + { + return static::$instance = $container; + } + /** + * Determine if a given offset exists. + * + * @param string $key + * @return bool + */ + public function offsetExists($key) : bool + { + return $this->bound($key); + } + /** + * Get the value at a given offset. + * + * @param string $key + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetGet($key) + { + return $this->make($key); + } + /** + * Set the value at a given offset. + * + * @param string $key + * @param mixed $value + * @return void + */ + public function offsetSet($key, $value) : void + { + $this->bind($key, $value instanceof Closure ? $value : function () use($value) { + return $value; + }); + } + /** + * Unset the value at a given offset. + * + * @param string $key + * @return void + */ + public function offsetUnset($key) : void + { + unset($this->bindings[$key], $this->instances[$key], $this->resolved[$key]); + } + /** + * Dynamically access container services. + * + * @param string $key + * @return mixed + */ + public function __get($key) + { + return $this[$key]; + } + /** + * Dynamically set container services. + * + * @param string $key + * @param mixed $value + * @return void + */ + public function __set($key, $value) + { + $this[$key] = $value; + } +} diff --git a/vendor/illuminate/container/ContextualBindingBuilder.php b/vendor/illuminate/container/ContextualBindingBuilder.php new file mode 100644 index 00000000..66aab941 --- /dev/null +++ b/vendor/illuminate/container/ContextualBindingBuilder.php @@ -0,0 +1,88 @@ +concrete = $concrete; + $this->container = $container; + } + /** + * Define the abstract target that depends on the context. + * + * @param string $abstract + * @return $this + */ + public function needs($abstract) + { + $this->needs = $abstract; + return $this; + } + /** + * Define the implementation for the contextual binding. + * + * @param \Closure|string|array $implementation + * @return void + */ + public function give($implementation) + { + foreach (Util::arrayWrap($this->concrete) as $concrete) { + $this->container->addContextualBinding($concrete, $this->needs, $implementation); + } + } + /** + * Define tagged services to be used as the implementation for the contextual binding. + * + * @param string $tag + * @return void + */ + public function giveTagged($tag) + { + $this->give(function ($container) use($tag) { + $taggedServices = $container->tagged($tag); + return \is_array($taggedServices) ? $taggedServices : \iterator_to_array($taggedServices); + }); + } + /** + * Specify the configuration item to bind as a primitive. + * + * @param string $key + * @param mixed $default + * @return void + */ + public function giveConfig($key, $default = null) + { + $this->give(function ($container) use($key, $default) { + return $container->get('config')->get($key, $default); + }); + } +} diff --git a/vendor/illuminate/container/EntryNotFoundException.php b/vendor/illuminate/container/EntryNotFoundException.php new file mode 100644 index 00000000..c072e4cf --- /dev/null +++ b/vendor/illuminate/container/EntryNotFoundException.php @@ -0,0 +1,10 @@ +count = $count; + $this->generator = $generator; + } + /** + * Get an iterator from the generator. + * + * @return \Traversable + */ + public function getIterator() : Traversable + { + return ($this->generator)(); + } + /** + * Get the total number of tagged services. + * + * @return int + */ + public function count() : int + { + if (\is_callable($count = $this->count)) { + $this->count = $count(); + } + return $this->count; + } +} diff --git a/vendor/illuminate/container/Util.php b/vendor/illuminate/container/Util.php new file mode 100644 index 00000000..397eed03 --- /dev/null +++ b/vendor/illuminate/container/Util.php @@ -0,0 +1,65 @@ +getType(); + if (!$type instanceof ReflectionNamedType || $type->isBuiltin()) { + return null; + } + $name = $type->getName(); + if (!\is_null($class = $parameter->getDeclaringClass())) { + if ($name === 'self') { + return $class->getName(); + } + if ($name === 'parent' && ($parent = $class->getParentClass())) { + return $parent->getName(); + } + } + return $name; + } +} diff --git a/vendor/illuminate/container/composer.json b/vendor/illuminate/container/composer.json new file mode 100755 index 00000000..b8e66331 --- /dev/null +++ b/vendor/illuminate/container/composer.json @@ -0,0 +1,38 @@ +{ + "name": "illuminate\/container", + "description": "The Illuminate Container package.", + "license": "MIT", + "homepage": "https:\/\/laravel.com", + "support": { + "issues": "https:\/\/github.com\/laravel\/framework\/issues", + "source": "https:\/\/github.com\/laravel\/framework" + }, + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "require": { + "php": "^8.2", + "illuminate\/contracts": "^11.0", + "psr\/container": "^1.1.1|^2.0.1" + }, + "provide": { + "psr\/container-implementation": "1.1|2.0" + }, + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Illuminate\\Container\\": "" + } + }, + "extra": { + "branch-alias": { + "dev-master": "11.x-dev" + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/vendor/illuminate/contracts/Auth/Access/Authorizable.php b/vendor/illuminate/contracts/Auth/Access/Authorizable.php new file mode 100644 index 00000000..a70611a7 --- /dev/null +++ b/vendor/illuminate/contracts/Auth/Access/Authorizable.php @@ -0,0 +1,15 @@ +|CastsAttributes|CastsInboundAttributes + */ + public static function castUsing(array $arguments); +} diff --git a/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php b/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php new file mode 100644 index 00000000..45a43af9 --- /dev/null +++ b/vendor/illuminate/contracts/Database/Eloquent/CastsAttributes.php @@ -0,0 +1,32 @@ + $attributes + * @return TGet|null + */ + public function get(Model $model, string $key, $value, array $attributes); + /** + * Transform the attribute to its underlying model values. + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param string $key + * @param mixed $value + * @param array $attributes + * @return mixed + */ + public function set(Model $model, string $key, $value, array $attributes); +} diff --git a/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php b/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php new file mode 100644 index 00000000..7030f57f --- /dev/null +++ b/vendor/illuminate/contracts/Database/Eloquent/CastsInboundAttributes.php @@ -0,0 +1,18 @@ +id = $id; + $this->class = $class; + $this->relations = $relations; + $this->connection = $connection; + } + /** + * Specify the collection class that should be used when serializing / restoring collections. + * + * @param string|null $collectionClass + * @return $this + */ + public function useCollectionClass(?string $collectionClass) + { + $this->collectionClass = $collectionClass; + return $this; + } +} diff --git a/vendor/illuminate/contracts/Database/Query/Builder.php b/vendor/illuminate/contracts/Database/Query/Builder.php new file mode 100644 index 00000000..ade92999 --- /dev/null +++ b/vendor/illuminate/contracts/Database/Query/Builder.php @@ -0,0 +1,12 @@ + + */ + public function getQueueableIds(); + /** + * Get the relationships of the entities being queued. + * + * @return array + */ + public function getQueueableRelations(); + /** + * Get the connection of the entities being queued. + * + * @return string|null + */ + public function getQueueableConnection(); +} diff --git a/vendor/illuminate/contracts/Queue/QueueableEntity.php b/vendor/illuminate/contracts/Queue/QueueableEntity.php new file mode 100644 index 00000000..b966d5f6 --- /dev/null +++ b/vendor/illuminate/contracts/Queue/QueueableEntity.php @@ -0,0 +1,25 @@ + + */ + public function toArray(); +} diff --git a/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php b/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php new file mode 100644 index 00000000..71d525b8 --- /dev/null +++ b/vendor/illuminate/contracts/Support/CanBeEscapedWhenCastToString.php @@ -0,0 +1,14 @@ +=7.1", + "nette\/utils": "^2.4 || ^3.0" + }, + "require-dev": { + "nette\/tester": "^2.0", + "tracy\/tracy": "^2.3", + "phpstan\/phpstan": "^0.12" + }, + "conflict": { + "nette\/nette": "<2.2" + }, + "autoload": { + "classmap": [ + "src\/" + ] + }, + "minimum-stability": "dev", + "scripts": { + "phpstan": "phpstan analyse", + "tester": "tester tests -s" + }, + "extra": { + "branch-alias": { + "dev-master": "2.6-dev" + } + } +} \ No newline at end of file diff --git a/vendor/nette/finder/license.md b/vendor/nette/finder/license.md new file mode 100644 index 00000000..cf741bd0 --- /dev/null +++ b/vendor/nette/finder/license.md @@ -0,0 +1,60 @@ +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/finder/readme.md b/vendor/nette/finder/readme.md new file mode 100644 index 00000000..6feeafb4 --- /dev/null +++ b/vendor/nette/finder/readme.md @@ -0,0 +1,159 @@ +Nette Finder: Files Searching +============================= + +[![Downloads this Month](https://img.shields.io/packagist/dm/nette/finder.svg)](https://packagist.org/packages/nette/finder) +[![Tests](https://github.com/nette/finder/workflows/Tests/badge.svg?branch=master)](https://github.com/nette/finder/actions) +[![Coverage Status](https://coveralls.io/repos/github/nette/finder/badge.svg?branch=master)](https://coveralls.io/github/nette/finder?branch=master) +[![Latest Stable Version](https://poser.pugx.org/nette/finder/v/stable)](https://github.com/nette/finder/releases) +[![License](https://img.shields.io/badge/license-New%20BSD-blue.svg)](https://github.com/nette/finder/blob/master/license.md) + + +Introduction +------------ + +Nette Finder makes browsing the directory structure really easy. + +Documentation can be found on the [website](https://doc.nette.org/finder). + + +[Support Me](https://github.com/sponsors/dg) +-------------------------------------------- + +Do you like Nette Finder? 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! + + +Installation +------------ + +```shell +composer require nette/finder +``` + +All examples assume the following class alias is defined: + +```php +use Nette\Utils\Finder; +``` + + +Searching for Files +------------------- + +How to find all `*.txt` files in `$dir` directory and all its subdirectories? + +```php +foreach (Finder::findFiles('*.txt')->from($dir) as $key => $file) { + // $key is a string containing absolute filename with path + // $file is an instance of SplFileInfo +} +``` + +The files in the `$file` variable are instances of the `SplFileInfo` class. + +If the directory does not exist, an `Nette\UnexpectedValueException` is thrown. + +And what about searching for files in a directory without subdirectories? Instead of `from()` use `in()`: + +```php +Finder::findFiles('*.txt')->in($dir) +``` + +Search by multiple masks and even multiple directories at once: + +```php +Finder::findFiles('*.txt', '*.php') + ->in($dir1, $dir2) // or from($dir1, $dir2) +``` + +Depth of search can be limited using the `limitDepth()` method. + + +Searching for Directories +------------------------- + +In addition to files, it is possible to search for directories using `Finder::findDirectories('subdir*')`. + +Or to search for files and directories together using `Finder::find('*.txt')`, the mask in this case only applies to files. When searching recursively with `from()`, the subdirectory is returned first, followed by the files in it, which can be reversed with `childFirst()`. + + +Mask +---- + +The mask does not have to describe only the file name, but also the path. Example: searching for `*.jpg` files located in a subdirectory starting with `imag`: + +```php +Finder::findFiles('imag*/*.jpg') +``` + +Thus, the known wildcards `*` and `?` represent any characters except the directory separator `/`. The double `**` represents any characters, including the directory separator: + +```php +Finder::findFiles('imag**/*.jpg') +// finds also image/subdir/file.jpg +``` + +In addition you can use in the mask ranges `[...]` or negative ranges `[!...]` known from regular expressions. Searching for `*.txt` files containing a digit in the name: + +```php +Finder::findFiles('*[0-9]*.txt') +``` + + +Excluding +--------- + +Use `exclude()` to pass masks that the file must not match. Searching for `*.txt` files, except those containing '`X`' in the name: + +```php +Finder::findFiles('*.txt') + ->exclude('*X*') +``` + +If `exclude()` is specified **after** `from()`, it applies to crawled subdirectories: + +```php +Finder::findFiles('*.php') + ->from($dir) + ->exclude('temp', '.git') +``` + + + +Filtering +--------- + +You can also filter the results, for example by file size. Here's how to find files of size between 100 and 200 bytes: + +```php +Finder::findFiles('*.php') + ->size('>=', 100) + ->size('<=', 200) + ->from($dir) +``` + +Filtering by date of last change. Example: searching for files changed in the last two weeks: + +```php +Finder::findFiles('*.php') + ->date('>', '- 2 weeks') + ->from($dir) +``` + +Both functions understand the operators `>`, `>=`, `<`, `<=`, `=`, `!=`. + +Here we traverse PHP files with number of lines greater than 1000. As a filter we use a custom callback: + +```php +$hasMoreThan100Lines = function (SplFileInfo $file): bool { + return count(file($file->getPathname())) > 1000; +}; + +Finder::findFiles('*.php') + ->filter($hasMoreThan100Lines) +``` + +Handy, right? You will certainly find a use for Finder in your applications. diff --git a/vendor/nette/finder/src/Utils/Finder.php b/vendor/nette/finder/src/Utils/Finder.php new file mode 100644 index 00000000..6cab0a0e --- /dev/null +++ b/vendor/nette/finder/src/Utils/Finder.php @@ -0,0 +1,317 @@ + + * Finder::findFiles('*.php') + * ->size('> 10kB') + * ->from('.') + * ->exclude('temp'); + * + * + * @implements \IteratorAggregate + */ +class Finder implements \IteratorAggregate, \Countable +{ + use Nette\SmartObject; + /** @var callable[] extension methods */ + private static $extMethods = []; + /** @var array */ + private $paths = []; + /** @var array of filters */ + private $groups = []; + /** @var array filter for recursive traversing */ + private $exclude = []; + /** @var int */ + private $order = RecursiveIteratorIterator::SELF_FIRST; + /** @var int */ + private $maxDepth = -1; + /** @var array */ + private $cursor; + /** + * Begins search for files and directories matching mask. + * @param string ...$masks + * @return static + */ + public static function find(...$masks) : self + { + $masks = \is_array($tmp = \reset($masks)) ? $tmp : $masks; + return (new static())->select($masks, 'isDir')->select($masks, 'isFile'); + } + /** + * Begins search for files matching mask. + * @param string ...$masks + * @return static + */ + public static function findFiles(...$masks) : self + { + $masks = \is_array($tmp = \reset($masks)) ? $tmp : $masks; + return (new static())->select($masks, 'isFile'); + } + /** + * Begins search for directories matching mask. + * @param string ...$masks + * @return static + */ + public static function findDirectories(...$masks) : self + { + $masks = \is_array($tmp = \reset($masks)) ? $tmp : $masks; + return (new static())->select($masks, 'isDir'); + } + /** + * Creates filtering group by mask & type selector. + * @return static + */ + private function select(array $masks, string $type) : self + { + $this->cursor =& $this->groups[]; + $pattern = self::buildPattern($masks); + $this->filter(function (RecursiveDirectoryIterator $file) use($type, $pattern) : bool { + return !$file->isDot() && $file->{$type}() && (!$pattern || \preg_match($pattern, '/' . \strtr($file->getSubPathName(), '\\', '/'))); + }); + return $this; + } + /** + * Searches in the given folder(s). + * @param string ...$paths + * @return static + */ + public function in(...$paths) : self + { + $this->maxDepth = 0; + return $this->from(...$paths); + } + /** + * Searches recursively from the given folder(s). + * @param string ...$paths + * @return static + */ + public function from(...$paths) : self + { + if ($this->paths) { + throw new Nette\InvalidStateException('Directory to search has already been specified.'); + } + $this->paths = \is_array($tmp = \reset($paths)) ? $tmp : $paths; + $this->cursor =& $this->exclude; + return $this; + } + /** + * Shows folder content prior to the folder. + * @return static + */ + public function childFirst() : self + { + $this->order = RecursiveIteratorIterator::CHILD_FIRST; + return $this; + } + /** + * Converts Finder pattern to regular expression. + */ + private static function buildPattern(array $masks) : ?string + { + $pattern = []; + foreach ($masks as $mask) { + $mask = \rtrim(\strtr($mask, '\\', '/'), '/'); + $prefix = ''; + if ($mask === '') { + continue; + } elseif ($mask === '*') { + return null; + } elseif ($mask[0] === '/') { + // absolute fixing + $mask = \ltrim($mask, '/'); + $prefix = '(?<=^/)'; + } + $pattern[] = $prefix . \strtr(\preg_quote($mask, '#'), ['\\*\\*' => '.*', '\\*' => '[^/]*', '\\?' => '[^/]', '\\[\\!' => '[^', '\\[' => '[', '\\]' => ']', '\\-' => '-']); + } + return $pattern ? '#/(' . \implode('|', $pattern) . ')$#Di' : null; + } + /********************* iterator generator ****************d*g**/ + /** @deprecated */ + public function count() : int + { + \trigger_error('Nette\\Utils\\Finder::count is deprecated.', \E_USER_DEPRECATED); + return \iterator_count($this->getIterator()); + } + /** + * Returns iterator. + */ + public function getIterator() : \Iterator + { + if (!$this->paths) { + throw new Nette\InvalidStateException('Call in() or from() to specify directory to search.'); + } elseif (\count($this->paths) === 1) { + return $this->buildIterator((string) $this->paths[0]); + } + $iterator = new \AppendIterator(); + foreach ($this->paths as $path) { + $iterator->append($this->buildIterator((string) $path)); + } + return $iterator; + } + /** + * Returns per-path iterator. + */ + private function buildIterator(string $path) : \Iterator + { + $iterator = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::FOLLOW_SYMLINKS); + if ($this->exclude) { + $iterator = new \RecursiveCallbackFilterIterator($iterator, function ($foo, $bar, RecursiveDirectoryIterator $file) : bool { + if (!$file->isDot() && !$file->isFile()) { + foreach ($this->exclude as $filter) { + if (!$filter($file)) { + return \false; + } + } + } + return \true; + }); + } + if ($this->maxDepth !== 0) { + $iterator = new RecursiveIteratorIterator($iterator, $this->order); + $iterator->setMaxDepth($this->maxDepth); + } + $iterator = new \CallbackFilterIterator($iterator, function ($foo, $bar, \Iterator $file) : bool { + while ($file instanceof \OuterIterator) { + $file = $file->getInnerIterator(); + } + foreach ($this->groups as $filters) { + foreach ($filters as $filter) { + if (!$filter($file)) { + continue 2; + } + } + return \true; + } + return \false; + }); + return $iterator; + } + /********************* filtering ****************d*g**/ + /** + * Restricts the search using mask. + * Excludes directories from recursive traversing. + * @param string ...$masks + * @return static + */ + public function exclude(...$masks) : self + { + $masks = \is_array($tmp = \reset($masks)) ? $tmp : $masks; + $pattern = self::buildPattern($masks); + if ($pattern) { + $this->filter(function (RecursiveDirectoryIterator $file) use($pattern) : bool { + return !\preg_match($pattern, '/' . \strtr($file->getSubPathName(), '\\', '/')); + }); + } + return $this; + } + /** + * Restricts the search using callback. + * @param callable(RecursiveDirectoryIterator): bool $callback + * @return static + */ + public function filter(callable $callback) : self + { + $this->cursor[] = $callback; + return $this; + } + /** + * Limits recursion level. + * @return static + */ + public function limitDepth(int $depth) : self + { + $this->maxDepth = $depth; + return $this; + } + /** + * Restricts the search by size. + * @param string $operator "[operator] [size] [unit]" example: >=10kB + * @return static + */ + public function size(string $operator, ?int $size = null) : self + { + if (\func_num_args() === 1) { + // in $operator is predicate + if (!\preg_match('#^(?:([=<>!]=?|<>)\\s*)?((?:\\d*\\.)?\\d+)\\s*(K|M|G|)B?$#Di', $operator, $matches)) { + throw new Nette\InvalidArgumentException('Invalid size predicate format.'); + } + [, $operator, $size, $unit] = $matches; + static $units = ['' => 1, 'k' => 1000.0, 'm' => 1000000.0, 'g' => 1000000000.0]; + $size *= $units[\strtolower($unit)]; + $operator = $operator ?: '='; + } + return $this->filter(function (RecursiveDirectoryIterator $file) use($operator, $size) : bool { + return self::compare($file->getSize(), $operator, $size); + }); + } + /** + * Restricts the search by modified time. + * @param string $operator "[operator] [date]" example: >1978-01-23 + * @param string|int|\DateTimeInterface $date + * @return static + */ + public function date(string $operator, $date = null) : self + { + if (\func_num_args() === 1) { + // in $operator is predicate + if (!\preg_match('#^(?:([=<>!]=?|<>)\\s*)?(.+)$#Di', $operator, $matches)) { + throw new Nette\InvalidArgumentException('Invalid date predicate format.'); + } + [, $operator, $date] = $matches; + $operator = $operator ?: '='; + } + $date = DateTime::from($date)->format('U'); + return $this->filter(function (RecursiveDirectoryIterator $file) use($operator, $date) : bool { + return self::compare($file->getMTime(), $operator, $date); + }); + } + /** + * Compares two values. + */ + public static function compare($l, string $operator, $r) : bool + { + switch ($operator) { + case '>': + return $l > $r; + case '>=': + return $l >= $r; + case '<': + return $l < $r; + case '<=': + return $l <= $r; + case '=': + case '==': + return $l == $r; + case '!': + case '!=': + case '<>': + return $l != $r; + default: + throw new Nette\InvalidArgumentException("Unknown operator {$operator}."); + } + } + /********************* extension methods ****************d*g**/ + /** @deprecated */ + public function __call(string $name, array $args) + { + return isset(self::$extMethods[$name]) ? self::$extMethods[$name]($this, ...$args) : Nette\Utils\ObjectHelpers::strictCall(static::class, $name, \array_keys(self::$extMethods)); + } + /** @deprecated */ + public static function extensionMethod(string $name, callable $callback) : void + { + \trigger_error(__METHOD__ . '() is deprecated.', \E_USER_DEPRECATED); + self::$extMethods[$name] = $callback; + } +} diff --git a/vendor/nette/robot-loader/composer.json b/vendor/nette/robot-loader/composer.json new file mode 100644 index 00000000..cad004eb --- /dev/null +++ b/vendor/nette/robot-loader/composer.json @@ -0,0 +1,53 @@ +{ + "name": "nette\/robot-loader", + "description": "\ud83c\udf40 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.", + "keywords": [ + "nette", + "autoload", + "class", + "trait", + "interface" + ], + "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": ">=7.1", + "ext-tokenizer": "*", + "nette\/finder": "^2.5 || ^3.0", + "nette\/utils": "^3.0" + }, + "require-dev": { + "nette\/tester": "^2.0", + "tracy\/tracy": "^2.3", + "phpstan\/phpstan": "^0.12" + }, + "autoload": { + "classmap": [ + "src\/" + ] + }, + "minimum-stability": "dev", + "scripts": { + "phpstan": "phpstan analyse", + "tester": "tester tests -s" + }, + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + } +} \ No newline at end of file diff --git a/vendor/nette/robot-loader/license.md b/vendor/nette/robot-loader/license.md new file mode 100644 index 00000000..cf741bd0 --- /dev/null +++ b/vendor/nette/robot-loader/license.md @@ -0,0 +1,60 @@ +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/robot-loader/ncs.php b/vendor/nette/robot-loader/ncs.php new file mode 100644 index 00000000..6b4c90c2 --- /dev/null +++ b/vendor/nette/robot-loader/ncs.php @@ -0,0 +1,13 @@ + \false, +]; diff --git a/vendor/nette/robot-loader/readme.md b/vendor/nette/robot-loader/readme.md new file mode 100644 index 00000000..51036982 --- /dev/null +++ b/vendor/nette/robot-loader/readme.md @@ -0,0 +1,131 @@ +RobotLoader: comfortable autoloading +==================================== + +[![Downloads this Month](https://img.shields.io/packagist/dm/nette/robot-loader.svg)](https://packagist.org/packages/nette/robot-loader) +[![Tests](https://github.com/nette/robot-loader/workflows/Tests/badge.svg?branch=master)](https://github.com/nette/robot-loader/actions) +[![Coverage Status](https://coveralls.io/repos/github/nette/robot-loader/badge.svg?branch=master)](https://coveralls.io/github/nette/robot-loader?branch=master) +[![Latest Stable Version](https://poser.pugx.org/nette/robot-loader/v/stable)](https://github.com/nette/robot-loader/releases) +[![License](https://img.shields.io/badge/license-New%20BSD-blue.svg)](https://github.com/nette/robot-loader/blob/master/license.md) + + +Introduction +------------ + +RobotLoader is a tool that gives you comfort of automated class loading for your entire application including third-party libraries. + +- get rid of all `require` +- does not require strict directory or file naming conventions +- extremely fast +- no manual cache updates, everything runs automatically +- highly mature, stable and widely used library + +So we can forget about those famous code blocks: + +```php +require_once 'Utils/Page.php'; +require_once 'Utils/Style.php'; +require_once 'Utils/Paginator.php'; +... +``` + +[Support Me](https://github.com/sponsors/dg) +-------------------------------------------- + +Do you like RobotLoader? 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! + + +Installation +------------ + +The recommended way to install is via Composer: + +```shell +composer require nette/robot-loader +``` + +It requires PHP version 7.1 and supports PHP up to 8.2. + + +Usage +----- + +Like the Google robot crawls and indexes websites, [RobotLoader](https://api.nette.org/3.0/Nette/Loaders/RobotLoader.html) crawls all PHP scripts and records what classes and interfaces were found in them. These records are then saved in cache and used during all subsequent requests. You just need to specify what directories to index and where to save the cache: + +```php +$loader = new Nette\Loaders\RobotLoader; + +// directories to be indexed by RobotLoader (including subdirectories) +$loader->addDirectory(__DIR__ . '/app'); +$loader->addDirectory(__DIR__ . '/libs'); + +// use 'temp' directory for cache +$loader->setTempDirectory(__DIR__ . '/temp'); +$loader->register(); // Run the RobotLoader +``` + +And that's all. From now on, you don't need to use `require`. Great, isn't it? + +When RobotLoader encounters duplicate class name during indexing, it throws an exception and informs you about it. RobotLoader also automatically updates the cache when it has to load a class it doesn't know. We recommend disabling this on production servers, see [Caching](#Caching). + +If you want RobotLoader to skip some directories, use `$loader->excludeDirectory('temp')` (it can be called multiple times or you can pass multiple directories). + +By default, RobotLoader reports errors in PHP files by throwing exception `ParseError`. It can be disabled via `$loader->reportParseErrors(false)`. + + +PHP Files Analyzer +------------------ + +RobotLoader can also be used purely to find classes, interfaces, and trait in PHP files **without** using the autoloading feature: + +```php +$loader = new Nette\Loaders\RobotLoader; +$loader->addDirectory(__DIR__ . '/app'); + +// Scans directories for classes / intefaces / traits +$loader->rebuild(); + +// Returns array of class => filename pairs +$res = $loader->getIndexedClasses(); +``` + +Even with such use, you can use the cache. As a result, unmodified files will not be repeatedly analyzed when rescanning: + +```php +$loader = new Nette\Loaders\RobotLoader; +$loader->addDirectory(__DIR__ . '/app'); +$loader->setTempDirectory(__DIR__ . '/temp'); + +// Scans directories using a cache +$loader->refresh(); + +// Returns array of class => filename pairs +$res = $loader->getIndexedClasses(); +``` + +Caching +------- + +RobotLoader is very fast because it cleverly uses the cache. + +When developing with it, you have practically no idea that it runs on the background. It continuously updates the cache because it knows that classes and files can be created, deleted, renamed, etc. And it doesn't repeatedly scan unmodified files. + +When used on a production server, on the other hand, we recommend disabling the cache update using `$loader->setAutoRefresh(false)`, because the files are not changing. At the same time, it is necessary to **clear the cache** when uploading a new version on the hosting. + +Of course, the initial scanning of files, when the cache does not already exist, may take a few seconds for larger applications. RobotLoader has built-in prevention against [cache stampede](https://en.wikipedia.org/wiki/Cache_stampede). +This is a situation where production server receives a large number of concurrent requests and because RobotLoader's cache does not yet exist, they would all start scanning the files. Which spikes CPU and filesystem usage. +Fortunately, RobotLoader works in such a way that for multiple concurrent requests, only the first thread indexes the files, creates a cache, the others wait, and then use the cache. + + +PSR-4 +----- + +Today, Composer can be used for autoloading in compliance with PSR-4. Simply saying, it is a system where the namespaces and class names correspond to the directory structure and file names, ie `App\Router\RouterFactory` is located in the file `/path/to/App/Router/RouterFactory.php`. + +RobotLoader is not tied to any fixed structure, therefore, it is useful in situations where it does not suit you to have the directory structure designed as namespaces in PHP, or when you are developing an application that has historically not used such conventions. It is also possible to use both loaders together. + + +If you like RobotLoader, **[please make a donation now](https://nette.org/donate)**. Thank you! diff --git a/vendor/nette/robot-loader/src/RobotLoader/RobotLoader.php b/vendor/nette/robot-loader/src/RobotLoader/RobotLoader.php new file mode 100644 index 00000000..49b78b58 --- /dev/null +++ b/vendor/nette/robot-loader/src/RobotLoader/RobotLoader.php @@ -0,0 +1,444 @@ + + * $loader = new Nette\Loaders\RobotLoader; + * $loader->addDirectory('app'); + * $loader->excludeDirectory('app/exclude'); + * $loader->setTempDirectory('temp'); + * $loader->register(); + * + */ +class RobotLoader +{ + use Nette\SmartObject; + private const RetryLimit = 3; + /** @var string[] */ + public $ignoreDirs = ['.*', '*.old', '*.bak', '*.tmp', 'temp']; + /** @var string[] */ + public $acceptFiles = ['*.php']; + /** @var bool */ + private $autoRebuild = \true; + /** @var bool */ + private $reportParseErrors = \true; + /** @var string[] */ + private $scanPaths = []; + /** @var string[] */ + private $excludeDirs = []; + /** @var array class => [file, time] */ + private $classes = []; + /** @var bool */ + private $cacheLoaded = \false; + /** @var bool */ + private $refreshed = \false; + /** @var array class => counter */ + private $missingClasses = []; + /** @var array file => mtime */ + private $emptyFiles = []; + /** @var string|null */ + private $tempDirectory; + /** @var bool */ + private $needSave = \false; + public function __construct() + { + if (!\extension_loaded('tokenizer')) { + throw new Nette\NotSupportedException('PHP extension Tokenizer is not loaded.'); + } + } + public function __destruct() + { + if ($this->needSave) { + $this->saveCache(); + } + } + /** + * Register autoloader. + */ + public function register(bool $prepend = \false) : self + { + \spl_autoload_register([$this, 'tryLoad'], \true, $prepend); + return $this; + } + /** + * Handles autoloading of classes, interfaces or traits. + */ + public function tryLoad(string $type) : void + { + $this->loadCache(); + $missing = $this->missingClasses[$type] ?? null; + if ($missing >= self::RetryLimit) { + return; + } + [$file, $mtime] = $this->classes[$type] ?? null; + if ($this->autoRebuild) { + if (!$this->refreshed) { + if (!$file || !\is_file($file)) { + $this->refreshClasses(); + [$file] = $this->classes[$type] ?? null; + $this->needSave = \true; + } elseif (\filemtime($file) !== $mtime) { + $this->updateFile($file); + [$file] = $this->classes[$type] ?? null; + $this->needSave = \true; + } + } + if (!$file || !\is_file($file)) { + $this->missingClasses[$type] = ++$missing; + $this->needSave = $this->needSave || $file || $missing <= self::RetryLimit; + unset($this->classes[$type]); + $file = null; + } + } + if ($file) { + (static function ($file) { + require $file; + })($file); + } + } + /** + * Add path or paths to list. + * @param string ...$paths absolute path + */ + public function addDirectory(...$paths) : self + { + if (\is_array($paths[0] ?? null)) { + \trigger_error(__METHOD__ . '() use variadics ...$paths to add an array of paths.', \E_USER_WARNING); + $paths = $paths[0]; + } + $this->scanPaths = \array_merge($this->scanPaths, $paths); + return $this; + } + public function reportParseErrors(bool $on = \true) : self + { + $this->reportParseErrors = $on; + return $this; + } + /** + * Excludes path or paths from list. + * @param string ...$paths absolute path + */ + public function excludeDirectory(...$paths) : self + { + if (\is_array($paths[0] ?? null)) { + \trigger_error(__METHOD__ . '() use variadics ...$paths to add an array of paths.', \E_USER_WARNING); + $paths = $paths[0]; + } + $this->excludeDirs = \array_merge($this->excludeDirs, $paths); + return $this; + } + /** + * @return array class => filename + */ + public function getIndexedClasses() : array + { + $this->loadCache(); + $res = []; + foreach ($this->classes as $class => [$file]) { + $res[$class] = $file; + } + return $res; + } + /** + * Rebuilds class list cache. + */ + public function rebuild() : void + { + $this->cacheLoaded = \true; + $this->classes = $this->missingClasses = $this->emptyFiles = []; + $this->refreshClasses(); + if ($this->tempDirectory) { + $this->saveCache(); + } + } + /** + * Refreshes class list cache. + */ + public function refresh() : void + { + $this->loadCache(); + if (!$this->refreshed) { + $this->refreshClasses(); + $this->saveCache(); + } + } + /** + * Refreshes $this->classes & $this->emptyFiles. + */ + private function refreshClasses() : void + { + $this->refreshed = \true; + // prevents calling refreshClasses() or updateFile() in tryLoad() + $files = $this->emptyFiles; + $classes = []; + foreach ($this->classes as $class => [$file, $mtime]) { + $files[$file] = $mtime; + $classes[$file][] = $class; + } + $this->classes = $this->emptyFiles = []; + foreach ($this->scanPaths as $path) { + $iterator = \is_file($path) ? [new SplFileInfo($path)] : $this->createFileIterator($path); + foreach ($iterator as $fileInfo) { + $mtime = $fileInfo->getMTime(); + $file = $fileInfo->getPathname(); + $foundClasses = isset($files[$file]) && $files[$file] === $mtime ? $classes[$file] ?? [] : $this->scanPhp($file); + if (!$foundClasses) { + $this->emptyFiles[$file] = $mtime; + } + $files[$file] = $mtime; + $classes[$file] = []; + // prevents the error when adding the same file twice + foreach ($foundClasses as $class) { + if (isset($this->classes[$class])) { + throw new Nette\InvalidStateException(\sprintf('Ambiguous class %s resolution; defined in %s and in %s.', $class, $this->classes[$class][0], $file)); + } + $this->classes[$class] = [$file, $mtime]; + unset($this->missingClasses[$class]); + } + } + } + } + /** + * Creates an iterator scaning directory for PHP files, subdirectories and 'netterobots.txt' files. + * @throws Nette\IOException if path is not found + */ + private function createFileIterator(string $dir) : Nette\Utils\Finder + { + if (!\is_dir($dir)) { + throw new Nette\IOException(\sprintf("File or directory '%s' not found.", $dir)); + } + $dir = \realpath($dir) ?: $dir; + // realpath does not work in phar + if (\is_string($ignoreDirs = $this->ignoreDirs)) { + \trigger_error(self::class . ': $ignoreDirs must be an array.', \E_USER_WARNING); + $ignoreDirs = \preg_split('#[,\\s]+#', $ignoreDirs); + } + $disallow = []; + foreach (\array_merge($ignoreDirs, $this->excludeDirs) as $item) { + if ($item = \realpath($item)) { + $disallow[\str_replace('\\', '/', $item)] = \true; + } + } + if (\is_string($acceptFiles = $this->acceptFiles)) { + \trigger_error(self::class . ': $acceptFiles must be an array.', \E_USER_WARNING); + $acceptFiles = \preg_split('#[,\\s]+#', $acceptFiles); + } + $iterator = Nette\Utils\Finder::findFiles(...$acceptFiles)->filter(function (SplFileInfo $file) use(&$disallow) { + return $file->getRealPath() === \false ? \true : !isset($disallow[\str_replace('\\', '/', $file->getRealPath())]); + })->from($dir)->exclude(...$ignoreDirs)->filter($filter = function (SplFileInfo $dir) use(&$disallow) { + if ($dir->getRealPath() === \false) { + return \true; + } + $path = \str_replace('\\', '/', $dir->getRealPath()); + if (\is_file("{$path}/netterobots.txt")) { + foreach (\file("{$path}/netterobots.txt") as $s) { + if (\preg_match('#^(?:disallow\\s*:)?\\s*(\\S+)#i', $s, $matches)) { + $disallow[$path . \rtrim('/' . \ltrim($matches[1], '/'), '/')] = \true; + } + } + } + return !isset($disallow[$path]); + }); + $filter(new SplFileInfo($dir)); + return $iterator; + } + private function updateFile(string $file) : void + { + foreach ($this->classes as $class => [$prevFile]) { + if ($file === $prevFile) { + unset($this->classes[$class]); + } + } + $foundClasses = \is_file($file) ? $this->scanPhp($file) : []; + foreach ($foundClasses as $class) { + [$prevFile, $prevMtime] = $this->classes[$class] ?? null; + if (isset($prevFile) && @\filemtime($prevFile) !== $prevMtime) { + // @ file may not exists + $this->updateFile($prevFile); + [$prevFile] = $this->classes[$class] ?? null; + } + if (isset($prevFile)) { + throw new Nette\InvalidStateException(\sprintf('Ambiguous class %s resolution; defined in %s and in %s.', $class, $prevFile, $file)); + } + $this->classes[$class] = [$file, \filemtime($file)]; + } + } + /** + * Searches classes, interfaces and traits in PHP file. + * @return string[] + */ + private function scanPhp(string $file) : array + { + $code = \file_get_contents($file); + $expected = \false; + $namespace = $name = ''; + $level = $minLevel = 0; + $classes = []; + try { + $tokens = \token_get_all($code, \TOKEN_PARSE); + } catch (\ParseError $e) { + if ($this->reportParseErrors) { + $rp = new \ReflectionProperty($e, 'file'); + $rp->setAccessible(\true); + $rp->setValue($e, $file); + throw $e; + } + $tokens = []; + } + foreach ($tokens as $token) { + if (\is_array($token)) { + switch ($token[0]) { + case \T_COMMENT: + case \T_DOC_COMMENT: + case \T_WHITESPACE: + continue 2; + case \T_STRING: + case \PHP_VERSION_ID < 80000 ? \T_NS_SEPARATOR : \T_NAME_QUALIFIED: + if ($expected) { + $name .= $token[1]; + } + continue 2; + case \T_NAMESPACE: + case \T_CLASS: + case \T_INTERFACE: + case \T_TRAIT: + case \PHP_VERSION_ID < 80100 ? \T_CLASS : \T_ENUM: + $expected = $token[0]; + $name = ''; + continue 2; + case \T_CURLY_OPEN: + case \T_DOLLAR_OPEN_CURLY_BRACES: + $level++; + } + } + if ($expected) { + if ($expected === \T_NAMESPACE) { + $namespace = $name ? $name . '\\' : ''; + $minLevel = $token === '{' ? 1 : 0; + } elseif ($name && $level === $minLevel) { + $classes[] = $namespace . $name; + } + $expected = null; + } + if ($token === '{') { + $level++; + } elseif ($token === '}') { + $level--; + } + } + return $classes; + } + /********************* caching ****************d*g**/ + /** + * Sets auto-refresh mode. + */ + public function setAutoRefresh(bool $on = \true) : self + { + $this->autoRebuild = $on; + return $this; + } + /** + * Sets path to temporary directory. + */ + public function setTempDirectory(string $dir) : self + { + Nette\Utils\FileSystem::createDir($dir); + $this->tempDirectory = $dir; + return $this; + } + /** + * Loads class list from cache. + */ + private function loadCache() : void + { + if ($this->cacheLoaded) { + return; + } + $this->cacheLoaded = \true; + $file = $this->generateCacheFileName(); + // Solving atomicity to work everywhere is really pain in the ass. + // 1) We want to do as little as possible IO calls on production and also directory and file can be not writable (#19) + // so on Linux we include the file directly without shared lock, therefore, the file must be created atomically by renaming. + // 2) On Windows file cannot be renamed-to while is open (ie by include() #11), so we have to acquire a lock. + $lock = \defined('PHP_WINDOWS_VERSION_BUILD') ? $this->acquireLock("{$file}.lock", \LOCK_SH) : null; + $data = @(include $file); + // @ file may not exist + if (\is_array($data)) { + [$this->classes, $this->missingClasses, $this->emptyFiles] = $data; + return; + } + if ($lock) { + \flock($lock, \LOCK_UN); + // release shared lock so we can get exclusive + } + $lock = $this->acquireLock("{$file}.lock", \LOCK_EX); + // while waiting for exclusive lock, someone might have already created the cache + $data = @(include $file); + // @ file may not exist + if (\is_array($data)) { + [$this->classes, $this->missingClasses, $this->emptyFiles] = $data; + return; + } + $this->classes = $this->missingClasses = $this->emptyFiles = []; + $this->refreshClasses(); + $this->saveCache($lock); + // On Windows concurrent creation and deletion of a file can cause a 'permission denied' error, + // therefore, we will not delete the lock file. Windows is really annoying. + } + /** + * Writes class list to cache. + * @param resource $lock + */ + private function saveCache($lock = null) : void + { + // we have to acquire a lock to be able safely rename file + // on Linux: that another thread does not rename the same named file earlier + // on Windows: that the file is not read by another thread + $file = $this->generateCacheFileName(); + $lock = $lock ?: $this->acquireLock("{$file}.lock", \LOCK_EX); + $code = "classes, $this->missingClasses, $this->emptyFiles], \true) . ";\n"; + if (\file_put_contents("{$file}.tmp", $code) !== \strlen($code) || !\rename("{$file}.tmp", $file)) { + @\unlink("{$file}.tmp"); + // @ file may not exist + throw new \RuntimeException(\sprintf("Unable to create '%s'.", $file)); + } + if (\function_exists('opcache_invalidate')) { + @\opcache_invalidate($file, \true); + // @ can be restricted + } + } + /** @return resource */ + private function acquireLock(string $file, int $mode) + { + $handle = @\fopen($file, 'w'); + // @ is escalated to exception + if (!$handle) { + throw new \RuntimeException(\sprintf("Unable to create file '%s'. %s", $file, \error_get_last()['message'])); + } elseif (!@\flock($handle, $mode)) { + // @ is escalated to exception + throw new \RuntimeException(\sprintf("Unable to acquire %s lock on file '%s'. %s", $mode & \LOCK_EX ? 'exclusive' : 'shared', $file, \error_get_last()['message'])); + } + return $handle; + } + private function generateCacheFileName() : string + { + if (!$this->tempDirectory) { + throw new \LogicException('Set path to temporary directory using setTempDirectory().'); + } + return $this->tempDirectory . '/' . \md5(\serialize($this->getCacheKey())) . '.php'; + } + protected function getCacheKey() : array + { + return [$this->ignoreDirs, $this->acceptFiles, $this->scanPaths, $this->excludeDirs, 'v2']; + } +} diff --git a/vendor/nette/utils/composer.json b/vendor/nette/utils/composer.json new file mode 100644 index 00000000..c107f1f0 --- /dev/null +++ b/vendor/nette/utils/composer.json @@ -0,0 +1,72 @@ +{ + "name": "nette\/utils", + "description": "\ud83d\udee0 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": ">=7.2 <8.4" + }, + "require-dev": { + "nette\/tester": "~2.0", + "tracy\/tracy": "^2.3", + "phpstan\/phpstan": "^1.0", + "jetbrains\/phpstorm-attributes": "dev-master" + }, + "conflict": { + "nette\/di": "<3.0.6" + }, + "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-xml": "to use Strings::length() etc. when mbstring is not available", + "ext-gd": "to use Image", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "autoload": { + "classmap": [ + "src\/" + ] + }, + "minimum-stability": "dev", + "scripts": { + "phpstan": "phpstan analyse", + "tester": "tester tests -s" + }, + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + } +} \ No newline at end of file diff --git a/vendor/nette/utils/license.md b/vendor/nette/utils/license.md new file mode 100644 index 00000000..cf741bd0 --- /dev/null +++ b/vendor/nette/utils/license.md @@ -0,0 +1,60 @@ +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 new file mode 100644 index 00000000..5317b8e6 --- /dev/null +++ b/vendor/nette/utils/readme.md @@ -0,0 +1,54 @@ +Nette Utility Classes +===================== + +[![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](https://doc.nette.org/utils) for everyday use: + +- [Arrays](https://doc.nette.org/utils/arrays) - manipulate arrays +- [Callback](https://doc.nette.org/utils/callback) - PHP callbacks +- [Date and Time](https://doc.nette.org/utils/datetime) - modify times and dates +- [Filesystem](https://doc.nette.org/utils/filesystem) - copying, renaming, … +- [Helper Functions](https://doc.nette.org/utils/helpers) +- [HTML elements](https://doc.nette.org/utils/html-elements) - generate HTML +- [Images](https://doc.nette.org/utils/images) - crop, resize, rotate images +- [JSON](https://doc.nette.org/utils/json) - encoding and decoding +- [Generating Random Strings](https://doc.nette.org/utils/random) +- [Paginator](https://doc.nette.org/utils/paginator) - pagination math +- [PHP Reflection](https://doc.nette.org/utils/reflection) +- [Strings](https://doc.nette.org/utils/strings) - useful text functions +- [SmartObject](https://doc.nette.org/utils/smartobject) - PHP object enhancements +- [Validation](https://doc.nette.org/utils/validators) - validate inputs +- [Type](https://doc.nette.org/utils/type) - PHP data type + + +Installation +------------ + +The recommended way to install is via Composer: + +``` +composer require nette/utils +``` + +- Nette Utils 3.2 is compatible with PHP 7.2 to 8.3 +- Nette Utils 3.1 is compatible with PHP 7.1 to 8.0 +- Nette Utils 3.0 is compatible with PHP 7.1 to 8.0 +- Nette Utils 2.5 is compatible with PHP 5.6 to 8.0 + +[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/nette/utils/src/HtmlStringable.php b/vendor/nette/utils/src/HtmlStringable.php new file mode 100644 index 00000000..09765315 --- /dev/null +++ b/vendor/nette/utils/src/HtmlStringable.php @@ -0,0 +1,17 @@ +getIterator(); + } while ($iterator instanceof \IteratorAggregate); + \assert($iterator instanceof \Iterator); + } elseif ($iterator instanceof \Iterator) { + } elseif ($iterator instanceof \Traversable) { + $iterator = new \IteratorIterator($iterator); + } else { + throw new Nette\InvalidArgumentException(\sprintf('Invalid argument passed to %s; array or Traversable expected, %s given.', self::class, \is_object($iterator) ? \get_class($iterator) : \gettype($iterator))); + } + parent::__construct($iterator, 0); + } + /** + * Is the current element the first one? + */ + public function isFirst(?int $gridWidth = null) : bool + { + return $this->counter === 1 || $gridWidth && $this->counter !== 0 && ($this->counter - 1) % $gridWidth === 0; + } + /** + * Is the current element the last one? + */ + public function isLast(?int $gridWidth = null) : bool + { + return !$this->hasNext() || $gridWidth && $this->counter % $gridWidth === 0; + } + /** + * Is the iterator empty? + */ + public function isEmpty() : bool + { + return $this->counter === 0; + } + /** + * Is the counter odd? + */ + public function isOdd() : bool + { + return $this->counter % 2 === 1; + } + /** + * Is the counter even? + */ + public function isEven() : bool + { + return $this->counter % 2 === 0; + } + /** + * Returns the counter. + */ + public function getCounter() : int + { + return $this->counter; + } + /** + * Returns the count of elements. + */ + public function count() : int + { + $inner = $this->getInnerIterator(); + if ($inner instanceof \Countable) { + return $inner->count(); + } else { + throw new Nette\NotSupportedException('Iterator is not countable.'); + } + } + /** + * Forwards to the next element. + */ + public function next() : void + { + parent::next(); + if (parent::valid()) { + $this->counter++; + } + } + /** + * Rewinds the Iterator. + */ + public function rewind() : void + { + parent::rewind(); + $this->counter = parent::valid() ? 1 : 0; + } + /** + * Returns the next key. + * @return mixed + */ + public function getNextKey() + { + return $this->getInnerIterator()->key(); + } + /** + * Returns the next element. + * @return mixed + */ + public function getNextValue() + { + return $this->getInnerIterator()->current(); + } +} diff --git a/vendor/nette/utils/src/Iterators/Mapper.php b/vendor/nette/utils/src/Iterators/Mapper.php new file mode 100644 index 00000000..d8e3c471 --- /dev/null +++ b/vendor/nette/utils/src/Iterators/Mapper.php @@ -0,0 +1,27 @@ +callback = $callback; + } + #[\ReturnTypeWillChange] + public function current() + { + return ($this->callback)(parent::current(), parent::key()); + } +} diff --git a/vendor/nette/utils/src/SmartObject.php b/vendor/nette/utils/src/SmartObject.php new file mode 100644 index 00000000..769d12b4 --- /dev/null +++ b/vendor/nette/utils/src/SmartObject.php @@ -0,0 +1,120 @@ +{$name} ?? null; + if (\is_iterable($handlers)) { + foreach ($handlers as $handler) { + $handler(...$args); + } + } elseif ($handlers !== null) { + throw new UnexpectedValueException("Property {$class}::\${$name} must be iterable or null, " . \gettype($handlers) . ' given.'); + } + } else { + ObjectHelpers::strictCall($class, $name); + } + } + /** + * @throws MemberAccessException + */ + public static function __callStatic(string $name, array $args) + { + ObjectHelpers::strictStaticCall(static::class, $name); + } + /** + * @return mixed + * @throws MemberAccessException if the property is not defined. + */ + public function &__get(string $name) + { + $class = static::class; + if ($prop = ObjectHelpers::getMagicProperties($class)[$name] ?? null) { + // property getter + if (!($prop & 0b1)) { + throw new MemberAccessException("Cannot read a write-only property {$class}::\${$name}."); + } + $m = ($prop & 0b10 ? 'get' : 'is') . \ucfirst($name); + if ($prop & 0b10000) { + $trace = \debug_backtrace(0, 1)[0]; + // suppose this method is called from __call() + $loc = isset($trace['file'], $trace['line']) ? " in {$trace['file']} on line {$trace['line']}" : ''; + \trigger_error("Property {$class}::\${$name} is deprecated, use {$class}::{$m}() method{$loc}.", \E_USER_DEPRECATED); + } + if ($prop & 0b100) { + // return by reference + return $this->{$m}(); + } else { + $val = $this->{$m}(); + return $val; + } + } else { + ObjectHelpers::strictGet($class, $name); + } + } + /** + * @param mixed $value + * @return void + * @throws MemberAccessException if the property is not defined or is read-only + */ + public function __set(string $name, $value) + { + $class = static::class; + if (ObjectHelpers::hasProperty($class, $name)) { + // unsetted property + $this->{$name} = $value; + } elseif ($prop = ObjectHelpers::getMagicProperties($class)[$name] ?? null) { + // property setter + if (!($prop & 0b1000)) { + throw new MemberAccessException("Cannot write to a read-only property {$class}::\${$name}."); + } + $m = 'set' . \ucfirst($name); + if ($prop & 0b10000) { + $trace = \debug_backtrace(0, 1)[0]; + // suppose this method is called from __call() + $loc = isset($trace['file'], $trace['line']) ? " in {$trace['file']} on line {$trace['line']}" : ''; + \trigger_error("Property {$class}::\${$name} is deprecated, use {$class}::{$m}() method{$loc}.", \E_USER_DEPRECATED); + } + $this->{$m}($value); + } else { + ObjectHelpers::strictSet($class, $name); + } + } + /** + * @return void + * @throws MemberAccessException + */ + public function __unset(string $name) + { + $class = static::class; + if (!ObjectHelpers::hasProperty($class, $name)) { + throw new MemberAccessException("Cannot unset the property {$class}::\${$name}."); + } + } + public function __isset(string $name) : bool + { + return isset(ObjectHelpers::getMagicProperties(static::class)[$name]); + } +} diff --git a/vendor/nette/utils/src/StaticClass.php b/vendor/nette/utils/src/StaticClass.php new file mode 100644 index 00000000..16281d67 --- /dev/null +++ b/vendor/nette/utils/src/StaticClass.php @@ -0,0 +1,32 @@ + + * @implements \ArrayAccess + */ +class ArrayHash extends \stdClass implements \ArrayAccess, \Countable, \IteratorAggregate +{ + /** + * Transforms array to ArrayHash. + * @param array $array + * @return static + */ + public static function from(array $array, bool $recursive = \true) + { + $obj = new static(); + foreach ($array as $key => $value) { + $obj->{$key} = $recursive && \is_array($value) ? static::from($value, \true) : $value; + } + return $obj; + } + /** + * Returns an iterator over all items. + * @return \RecursiveArrayIterator + */ + public function getIterator() : \RecursiveArrayIterator + { + return new \RecursiveArrayIterator((array) $this); + } + /** + * Returns items count. + */ + public function count() : int + { + return \count((array) $this); + } + /** + * Replaces or appends a item. + * @param array-key $key + * @param T $value + */ + public function offsetSet($key, $value) : void + { + if (!\is_scalar($key)) { + // prevents null + throw new Nette\InvalidArgumentException(\sprintf('Key must be either a string or an integer, %s given.', \gettype($key))); + } + $this->{$key} = $value; + } + /** + * Returns a item. + * @param array-key $key + * @return T + */ + #[\ReturnTypeWillChange] + public function offsetGet($key) + { + return $this->{$key}; + } + /** + * Determines whether a item exists. + * @param array-key $key + */ + public function offsetExists($key) : bool + { + return isset($this->{$key}); + } + /** + * Removes the element from this list. + * @param array-key $key + */ + public function offsetUnset($key) : void + { + unset($this->{$key}); + } +} diff --git a/vendor/nette/utils/src/Utils/ArrayList.php b/vendor/nette/utils/src/Utils/ArrayList.php new file mode 100644 index 00000000..3f846760 --- /dev/null +++ b/vendor/nette/utils/src/Utils/ArrayList.php @@ -0,0 +1,111 @@ + + * @implements \ArrayAccess + */ +class ArrayList implements \ArrayAccess, \Countable, \IteratorAggregate +{ + use Nette\SmartObject; + /** @var mixed[] */ + private $list = []; + /** + * Transforms array to ArrayList. + * @param list $array + * @return static + */ + public static function from(array $array) + { + if (!Arrays::isList($array)) { + throw new Nette\InvalidArgumentException('Array is not valid list.'); + } + $obj = new static(); + $obj->list = $array; + return $obj; + } + /** + * Returns an iterator over all items. + * @return \ArrayIterator + */ + public function getIterator() : \ArrayIterator + { + return new \ArrayIterator($this->list); + } + /** + * Returns items count. + */ + public function count() : int + { + return \count($this->list); + } + /** + * Replaces or appends a item. + * @param int|null $index + * @param T $value + * @throws Nette\OutOfRangeException + */ + public function offsetSet($index, $value) : void + { + if ($index === null) { + $this->list[] = $value; + } elseif (!\is_int($index) || $index < 0 || $index >= \count($this->list)) { + throw new Nette\OutOfRangeException('Offset invalid or out of range'); + } else { + $this->list[$index] = $value; + } + } + /** + * Returns a item. + * @param int $index + * @return T + * @throws Nette\OutOfRangeException + */ + #[\ReturnTypeWillChange] + public function offsetGet($index) + { + if (!\is_int($index) || $index < 0 || $index >= \count($this->list)) { + throw new Nette\OutOfRangeException('Offset invalid or out of range'); + } + return $this->list[$index]; + } + /** + * Determines whether a item exists. + * @param int $index + */ + public function offsetExists($index) : bool + { + return \is_int($index) && $index >= 0 && $index < \count($this->list); + } + /** + * Removes the element at the specified position in this list. + * @param int $index + * @throws Nette\OutOfRangeException + */ + public function offsetUnset($index) : void + { + if (!\is_int($index) || $index < 0 || $index >= \count($this->list)) { + throw new Nette\OutOfRangeException('Offset invalid or out of range'); + } + \array_splice($this->list, $index, 1); + } + /** + * Prepends a item. + * @param T $value + */ + public function prepend($value) : void + { + $first = \array_slice($this->list, 0, 1); + $this->offsetSet(0, $value); + \array_splice($this->list, 1, 0, $first); + } +} diff --git a/vendor/nette/utils/src/Utils/Arrays.php b/vendor/nette/utils/src/Utils/Arrays.php new file mode 100644 index 00000000..36739c22 --- /dev/null +++ b/vendor/nette/utils/src/Utils/Arrays.php @@ -0,0 +1,394 @@ + $array + * @param array-key|array-key[] $key + * @param ?T $default + * @return ?T + * @throws Nette\InvalidArgumentException if item does not exist and default value is not provided + */ + public static function get(array $array, $key, $default = null) + { + foreach (is_array($key) ? $key : [$key] as $k) { + if (is_array($array) && \array_key_exists($k, $array)) { + $array = $array[$k]; + } else { + if (\func_num_args() < 3) { + throw new Nette\InvalidArgumentException("Missing item '{$k}'."); + } + return $default; + } + } + return $array; + } + /** + * Returns reference to array item. If the index does not exist, new one is created with value null. + * @template T + * @param array $array + * @param array-key|array-key[] $key + * @return ?T + * @throws Nette\InvalidArgumentException if traversed item is not an array + */ + public static function &getRef(array &$array, $key) + { + foreach (is_array($key) ? $key : [$key] as $k) { + if (is_array($array) || $array === null) { + $array =& $array[$k]; + } else { + throw new Nette\InvalidArgumentException('Traversed item is not an array.'); + } + } + return $array; + } + /** + * Recursively merges two fields. It is useful, for example, for merging tree structures. It behaves as + * the + operator for array, ie. it adds a key/value pair from the second array to the first one and retains + * the value from the first array in the case of a key collision. + * @template T1 + * @template T2 + * @param array $array1 + * @param array $array2 + * @return array + */ + public static function mergeTree(array $array1, array $array2) : array + { + $res = $array1 + $array2; + foreach (\array_intersect_key($array1, $array2) as $k => $v) { + if (is_array($v) && is_array($array2[$k])) { + $res[$k] = self::mergeTree($v, $array2[$k]); + } + } + return $res; + } + /** + * Returns zero-indexed position of given array key. Returns null if key is not found. + * @param array-key $key + * @return int|null offset if it is found, null otherwise + */ + public static function getKeyOffset(array $array, $key) : ?int + { + return Helpers::falseToNull(\array_search(self::toKey($key), \array_keys($array), \true)); + } + /** + * @deprecated use getKeyOffset() + */ + public static function searchKey(array $array, $key) : ?int + { + return self::getKeyOffset($array, $key); + } + /** + * Tests an array for the presence of value. + * @param mixed $value + */ + public static function contains(array $array, $value) : bool + { + return \in_array($value, $array, \true); + } + /** + * Returns the first item from the array or null if array is empty. + * @template T + * @param array $array + * @return ?T + */ + public static function first(array $array) + { + return count($array) ? \reset($array) : null; + } + /** + * Returns the last item from the array or null if array is empty. + * @template T + * @param array $array + * @return ?T + */ + public static function last(array $array) + { + return count($array) ? \end($array) : null; + } + /** + * Inserts the contents of the $inserted array into the $array immediately after the $key. + * If $key is null (or does not exist), it is inserted at the beginning. + * @param array-key|null $key + */ + public static function insertBefore(array &$array, $key, array $inserted) : void + { + $offset = $key === null ? 0 : (int) self::getKeyOffset($array, $key); + $array = \array_slice($array, 0, $offset, \true) + $inserted + \array_slice($array, $offset, count($array), \true); + } + /** + * Inserts the contents of the $inserted array into the $array before the $key. + * If $key is null (or does not exist), it is inserted at the end. + * @param array-key|null $key + */ + public static function insertAfter(array &$array, $key, array $inserted) : void + { + if ($key === null || ($offset = self::getKeyOffset($array, $key)) === null) { + $offset = count($array) - 1; + } + $array = \array_slice($array, 0, $offset + 1, \true) + $inserted + \array_slice($array, $offset + 1, count($array), \true); + } + /** + * Renames key in array. + * @param array-key $oldKey + * @param array-key $newKey + */ + public static function renameKey(array &$array, $oldKey, $newKey) : bool + { + $offset = self::getKeyOffset($array, $oldKey); + if ($offset === null) { + return \false; + } + $val =& $array[$oldKey]; + $keys = \array_keys($array); + $keys[$offset] = $newKey; + $array = \array_combine($keys, $array); + $array[$newKey] =& $val; + return \true; + } + /** + * Returns only those array items, which matches a regular expression $pattern. + * @param string[] $array + * @return string[] + */ + public static function grep( + array $array, + /** + * @language + */ + string $pattern, + int $flags = 0 + ) : array + { + return Strings::pcre('preg_grep', [$pattern, $array, $flags]); + } + /** + * Transforms multidimensional array to flat array. + */ + public static function flatten(array $array, bool $preserveKeys = \false) : array + { + $res = []; + $cb = $preserveKeys ? function ($v, $k) use(&$res) : void { + $res[$k] = $v; + } : function ($v) use(&$res) : void { + $res[] = $v; + }; + \array_walk_recursive($array, $cb); + return $res; + } + /** + * Checks if the array is indexed in ascending order of numeric keys from zero, a.k.a list. + * @param mixed $value + */ + public static function isList($value) : bool + { + $arrayIsListFunction = function (array $array) : bool { + if (\function_exists('array_is_list')) { + return \array_is_list($array); + } + if ($array === []) { + return \true; + } + $current_key = 0; + foreach ($array as $key => $noop) { + if ($key !== $current_key) { + return \false; + } + ++$current_key; + } + return \true; + }; + return is_array($value) && (\PHP_VERSION_ID < 80100 ? !$value || \array_keys($value) === \range(0, count($value) - 1) : $arrayIsListFunction($value)); + } + /** + * Reformats table to associative tree. Path looks like 'field|field[]field->field=field'. + * @param string|string[] $path + * @return array|\stdClass + */ + public static function associate(array $array, $path) + { + $parts = is_array($path) ? $path : \preg_split('#(\\[\\]|->|=|\\|)#', $path, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); + if (!$parts || $parts === ['->'] || $parts[0] === '=' || $parts[0] === '|') { + throw new Nette\InvalidArgumentException("Invalid path '{$path}'."); + } + $res = $parts[0] === '->' ? new \stdClass() : []; + foreach ($array as $rowOrig) { + $row = (array) $rowOrig; + $x =& $res; + for ($i = 0; $i < count($parts); $i++) { + $part = $parts[$i]; + if ($part === '[]') { + $x =& $x[]; + } elseif ($part === '=') { + if (isset($parts[++$i])) { + $x = $row[$parts[$i]]; + $row = null; + } + } elseif ($part === '->') { + if (isset($parts[++$i])) { + if ($x === null) { + $x = new \stdClass(); + } + $x =& $x->{$row[$parts[$i]]}; + } else { + $row = is_object($rowOrig) ? $rowOrig : (object) $row; + } + } elseif ($part !== '|') { + $x =& $x[(string) $row[$part]]; + } + } + if ($x === null) { + $x = $row; + } + } + return $res; + } + /** + * Normalizes array to associative array. Replace numeric keys with their values, the new value will be $filling. + * @param mixed $filling + */ + public static function normalize(array $array, $filling = null) : array + { + $res = []; + foreach ($array as $k => $v) { + $res[is_int($k) ? $v : $k] = is_int($k) ? $filling : $v; + } + return $res; + } + /** + * Returns and removes the value of an item from an array. If it does not exist, it throws an exception, + * or returns $default, if provided. + * @template T + * @param array $array + * @param array-key $key + * @param ?T $default + * @return ?T + * @throws Nette\InvalidArgumentException if item does not exist and default value is not provided + */ + public static function pick(array &$array, $key, $default = null) + { + if (\array_key_exists($key, $array)) { + $value = $array[$key]; + unset($array[$key]); + return $value; + } elseif (\func_num_args() < 3) { + throw new Nette\InvalidArgumentException("Missing item '{$key}'."); + } else { + return $default; + } + } + /** + * Tests whether at least one element in the array passes the test implemented by the + * provided callback with signature `function ($value, $key, array $array): bool`. + */ + public static function some(iterable $array, callable $callback) : bool + { + foreach ($array as $k => $v) { + if ($callback($v, $k, $array)) { + return \true; + } + } + return \false; + } + /** + * Tests whether all elements in the array pass the test implemented by the provided function, + * which has the signature `function ($value, $key, array $array): bool`. + */ + public static function every(iterable $array, callable $callback) : bool + { + foreach ($array as $k => $v) { + if (!$callback($v, $k, $array)) { + return \false; + } + } + return \true; + } + /** + * Calls $callback on all elements in the array and returns the array of return values. + * The callback has the signature `function ($value, $key, array $array): bool`. + */ + public static function map(iterable $array, callable $callback) : array + { + $res = []; + foreach ($array as $k => $v) { + $res[$k] = $callback($v, $k, $array); + } + return $res; + } + /** + * Invokes all callbacks and returns array of results. + * @param callable[] $callbacks + */ + public static function invoke(iterable $callbacks, ...$args) : array + { + $res = []; + foreach ($callbacks as $k => $cb) { + $res[$k] = $cb(...$args); + } + return $res; + } + /** + * Invokes method on every object in an array and returns array of results. + * @param object[] $objects + */ + public static function invokeMethod(iterable $objects, string $method, ...$args) : array + { + $res = []; + foreach ($objects as $k => $obj) { + $res[$k] = $obj->{$method}(...$args); + } + return $res; + } + /** + * Copies the elements of the $array array to the $object object and then returns it. + * @template T of object + * @param T $object + * @return T + */ + public static function toObject(iterable $array, $object) + { + foreach ($array as $k => $v) { + $object->{$k} = $v; + } + return $object; + } + /** + * Converts value to array key. + * @param mixed $value + * @return array-key + */ + public static function toKey($value) + { + return \key([$value => null]); + } + /** + * Returns copy of the $array where every item is converted to string + * and prefixed by $prefix and suffixed by $suffix. + * @param string[] $array + * @return string[] + */ + public static function wrap(array $array, string $prefix = '', string $suffix = '') : array + { + $res = []; + foreach ($array as $k => $v) { + $res[$k] = $prefix . $v . $suffix; + } + return $res; + } +} diff --git a/vendor/nette/utils/src/Utils/Callback.php b/vendor/nette/utils/src/Utils/Callback.php new file mode 100644 index 00000000..6feb1615 --- /dev/null +++ b/vendor/nette/utils/src/Utils/Callback.php @@ -0,0 +1,151 @@ +getMessage()); + } + } + /** + * Invokes callback. + * @return mixed + * @deprecated + */ + public static function invoke($callable, ...$args) + { + \trigger_error(__METHOD__ . '() is deprecated, use native invoking.', \E_USER_DEPRECATED); + self::check($callable); + return $callable(...$args); + } + /** + * Invokes callback with an array of parameters. + * @return mixed + * @deprecated + */ + public static function invokeArgs($callable, array $args = []) + { + \trigger_error(__METHOD__ . '() is deprecated, use native invoking.', \E_USER_DEPRECATED); + self::check($callable); + return $callable(...$args); + } + /** + * Invokes internal PHP function with own error handler. + * @return mixed + */ + public static function invokeSafe(string $function, array $args, callable $onError) + { + $prev = \set_error_handler(function ($severity, $message, $file) use($onError, &$prev, $function) : ?bool { + if ($file === __FILE__) { + $msg = \ini_get('html_errors') ? Html::htmlToText($message) : $message; + $msg = \preg_replace("#^{$function}\\(.*?\\): #", '', $msg); + if ($onError($msg, $severity) !== \false) { + return null; + } + } + return $prev ? $prev(...\func_get_args()) : \false; + }); + try { + return $function(...$args); + } finally { + \restore_error_handler(); + } + } + /** + * Checks that $callable is valid PHP callback. Otherwise throws exception. If the $syntax is set to true, only verifies + * that $callable has a valid structure to be used as a callback, but does not verify if the class or method actually exists. + * @param mixed $callable + * @return callable + * @throws Nette\InvalidArgumentException + */ + public static function check($callable, bool $syntax = \false) + { + if (!\is_callable($callable, $syntax)) { + throw new Nette\InvalidArgumentException($syntax ? 'Given value is not a callable type.' : \sprintf("Callback '%s' is not callable.", self::toString($callable))); + } + return $callable; + } + /** + * Converts PHP callback to textual form. Class or method may not exists. + * @param mixed $callable + */ + public static function toString($callable) : string + { + if ($callable instanceof \Closure) { + $inner = self::unwrap($callable); + return '{closure' . ($inner instanceof \Closure ? '}' : ' ' . self::toString($inner) . '}'); + } elseif (is_string($callable) && $callable[0] === "\x00") { + return '{lambda}'; + } else { + \is_callable(is_object($callable) ? [$callable, '__invoke'] : $callable, \true, $textual); + return $textual; + } + } + /** + * Returns reflection for method or function used in PHP callback. + * @param callable $callable type check is escalated to ReflectionException + * @return \ReflectionMethod|\ReflectionFunction + * @throws \ReflectionException if callback is not valid + */ + public static function toReflection($callable) : \ReflectionFunctionAbstract + { + if ($callable instanceof \Closure) { + $callable = self::unwrap($callable); + } + if (is_string($callable) && \strpos($callable, '::')) { + return new \ReflectionMethod($callable); + } elseif (is_array($callable)) { + return new \ReflectionMethod($callable[0], $callable[1]); + } elseif (is_object($callable) && !$callable instanceof \Closure) { + return new \ReflectionMethod($callable, '__invoke'); + } else { + return new \ReflectionFunction($callable); + } + } + /** + * Checks whether PHP callback is function or static method. + */ + public static function isStatic(callable $callable) : bool + { + return is_string(is_array($callable) ? $callable[0] : $callable); + } + /** + * Unwraps closure created by Closure::fromCallable(). + * @return callable|array + */ + public static function unwrap(\Closure $closure) + { + $r = new \ReflectionFunction($closure); + $class = $r->getClosureScopeClass(); + if (\substr($r->name, -1) === '}') { + return $closure; + } elseif (($obj = $r->getClosureThis()) && $class && \get_class($obj) === $class->name) { + return [$obj, $r->name]; + } elseif ($class) { + return [$class->name, $r->name]; + } else { + return $r->name; + } + } +} diff --git a/vendor/nette/utils/src/Utils/DateTime.php b/vendor/nette/utils/src/Utils/DateTime.php new file mode 100644 index 00000000..026d88db --- /dev/null +++ b/vendor/nette/utils/src/Utils/DateTime.php @@ -0,0 +1,105 @@ +format('Y-m-d H:i:s.u'), $time->getTimezone()); + } elseif (\is_numeric($time)) { + if ($time <= self::YEAR) { + $time += \time(); + } + return (new static('@' . $time))->setTimezone(new \DateTimeZone(\date_default_timezone_get())); + } else { + // textual or null + return new static((string) $time); + } + } + /** + * Creates DateTime object. + * @return static + * @throws Nette\InvalidArgumentException if the date and time are not valid. + */ + public static function fromParts(int $year, int $month, int $day, int $hour = 0, int $minute = 0, float $second = 0.0) + { + $s = \sprintf('%04d-%02d-%02d %02d:%02d:%02.5F', $year, $month, $day, $hour, $minute, $second); + if (!\checkdate($month, $day, $year) || $hour < 0 || $hour > 23 || $minute < 0 || $minute > 59 || $second < 0 || $second >= 60) { + throw new Nette\InvalidArgumentException("Invalid date '{$s}'"); + } + return new static($s); + } + /** + * Returns new DateTime object formatted according to the specified format. + * @param string $format The format the $time parameter should be in + * @param string $time + * @param string|\DateTimeZone $timezone (default timezone is used if null is passed) + * @return static|false + */ + #[\ReturnTypeWillChange] + public static function createFromFormat($format, $time, $timezone = null) + { + if ($timezone === null) { + $timezone = new \DateTimeZone(\date_default_timezone_get()); + } elseif (\is_string($timezone)) { + $timezone = new \DateTimeZone($timezone); + } elseif (!$timezone instanceof \DateTimeZone) { + throw new Nette\InvalidArgumentException('Invalid timezone given'); + } + $date = parent::createFromFormat($format, $time, $timezone); + return $date ? static::from($date) : \false; + } + /** + * Returns JSON representation in ISO 8601 (used by JavaScript). + */ + public function jsonSerialize() : string + { + return $this->format('c'); + } + /** + * Returns the date and time in the format 'Y-m-d H:i:s'. + */ + public function __toString() : string + { + return $this->format('Y-m-d H:i:s'); + } + /** + * Creates a copy with a modified time. + * @return static + */ + public function modifyClone(string $modify = '') + { + $dolly = clone $this; + return $modify ? $dolly->modify($modify) : $dolly; + } +} diff --git a/vendor/nette/utils/src/Utils/FileSystem.php b/vendor/nette/utils/src/Utils/FileSystem.php new file mode 100644 index 00000000..0feb433e --- /dev/null +++ b/vendor/nette/utils/src/Utils/FileSystem.php @@ -0,0 +1,186 @@ +getPathname()); + } + foreach ($iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($origin, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST) as $item) { + if ($item->isDir()) { + static::createDir($target . '/' . $iterator->getSubPathName()); + } else { + static::copy($item->getPathname(), $target . '/' . $iterator->getSubPathName()); + } + } + } else { + static::createDir(\dirname($target)); + if (($s = @\fopen($origin, 'rb')) && ($d = @\fopen($target, 'wb')) && @\stream_copy_to_stream($s, $d) === \false) { + // @ is escalated to exception + throw new Nette\IOException(\sprintf("Unable to copy file '%s' to '%s'. %s", self::normalizePath($origin), self::normalizePath($target), Helpers::getLastError())); + } + } + } + /** + * Deletes a file or an entire directory if exists. If the directory is not empty, it deletes its contents first. + * @throws Nette\IOException on error occurred + */ + public static function delete(string $path) : void + { + if (\is_file($path) || \is_link($path)) { + $func = \DIRECTORY_SEPARATOR === '\\' && \is_dir($path) ? 'rmdir' : 'unlink'; + if (!@$func($path)) { + // @ is escalated to exception + throw new Nette\IOException(\sprintf("Unable to delete '%s'. %s", self::normalizePath($path), Helpers::getLastError())); + } + } elseif (\is_dir($path)) { + foreach (new \FilesystemIterator($path) as $item) { + static::delete($item->getPathname()); + } + if (!@\rmdir($path)) { + // @ is escalated to exception + throw new Nette\IOException(\sprintf("Unable to delete directory '%s'. %s", self::normalizePath($path), Helpers::getLastError())); + } + } + } + /** + * Renames or moves a file or a directory. Overwrites existing files and directories by default. + * @throws Nette\IOException on error occurred + * @throws Nette\InvalidStateException if $overwrite is set to false and destination already exists + */ + public static function rename(string $origin, string $target, bool $overwrite = \true) : void + { + if (!$overwrite && \file_exists($target)) { + throw new Nette\InvalidStateException(\sprintf("File or directory '%s' already exists.", self::normalizePath($target))); + } elseif (!\file_exists($origin)) { + throw new Nette\IOException(\sprintf("File or directory '%s' not found.", self::normalizePath($origin))); + } else { + static::createDir(\dirname($target)); + if (\realpath($origin) !== \realpath($target)) { + static::delete($target); + } + if (!@\rename($origin, $target)) { + // @ is escalated to exception + throw new Nette\IOException(\sprintf("Unable to rename file or directory '%s' to '%s'. %s", self::normalizePath($origin), self::normalizePath($target), Helpers::getLastError())); + } + } + } + /** + * Reads the content of a file. + * @throws Nette\IOException on error occurred + */ + public static function read(string $file) : string + { + $content = @\file_get_contents($file); + // @ is escalated to exception + if ($content === \false) { + throw new Nette\IOException(\sprintf("Unable to read file '%s'. %s", self::normalizePath($file), Helpers::getLastError())); + } + return $content; + } + /** + * Writes the string to a file. + * @throws Nette\IOException on error occurred + */ + public static function write(string $file, string $content, ?int $mode = 0666) : void + { + static::createDir(\dirname($file)); + if (@\file_put_contents($file, $content) === \false) { + // @ is escalated to exception + throw new Nette\IOException(\sprintf("Unable to write file '%s'. %s", self::normalizePath($file), Helpers::getLastError())); + } + if ($mode !== null && !@\chmod($file, $mode)) { + // @ is escalated to exception + throw new Nette\IOException(\sprintf("Unable to chmod file '%s' to mode %s. %s", self::normalizePath($file), \decoct($mode), Helpers::getLastError())); + } + } + /** + * Sets file permissions to `$fileMode` or directory permissions to `$dirMode`. + * Recursively traverses and sets permissions on the entire contents of the directory as well. + * @throws Nette\IOException on error occurred + */ + public static function makeWritable(string $path, int $dirMode = 0777, int $fileMode = 0666) : void + { + if (\is_file($path)) { + if (!@\chmod($path, $fileMode)) { + // @ is escalated to exception + throw new Nette\IOException(\sprintf("Unable to chmod file '%s' to mode %s. %s", self::normalizePath($path), \decoct($fileMode), Helpers::getLastError())); + } + } elseif (\is_dir($path)) { + foreach (new \FilesystemIterator($path) as $item) { + static::makeWritable($item->getPathname(), $dirMode, $fileMode); + } + if (!@\chmod($path, $dirMode)) { + // @ is escalated to exception + throw new Nette\IOException(\sprintf("Unable to chmod directory '%s' to mode %s. %s", self::normalizePath($path), \decoct($dirMode), Helpers::getLastError())); + } + } else { + throw new Nette\IOException(\sprintf("File or directory '%s' not found.", self::normalizePath($path))); + } + } + /** + * Determines if the path is absolute. + */ + public static function isAbsolute(string $path) : bool + { + return (bool) \preg_match('#([a-z]:)?[/\\\\]|[a-z][a-z0-9+.-]*://#Ai', $path); + } + /** + * Normalizes `..` and `.` and directory separators in path. + */ + public static function normalizePath(string $path) : string + { + $parts = $path === '' ? [] : \preg_split('~[/\\\\]+~', $path); + $res = []; + foreach ($parts as $part) { + if ($part === '..' && $res && \end($res) !== '..' && \end($res) !== '') { + \array_pop($res); + } elseif ($part !== '.') { + $res[] = $part; + } + } + return $res === [''] ? \DIRECTORY_SEPARATOR : \implode(\DIRECTORY_SEPARATOR, $res); + } + /** + * Joins all segments of the path and normalizes the result. + */ + public static function joinPaths(string ...$paths) : string + { + return self::normalizePath(\implode('/', $paths)); + } +} diff --git a/vendor/nette/utils/src/Utils/Floats.php b/vendor/nette/utils/src/Utils/Floats.php new file mode 100644 index 00000000..a4d0d132 --- /dev/null +++ b/vendor/nette/utils/src/Utils/Floats.php @@ -0,0 +1,83 @@ + $b it returns 1 + * @throws \LogicException if one of parameters is NAN + */ + public static function compare(float $a, float $b) : int + { + if (\is_nan($a) || \is_nan($b)) { + throw new \LogicException('Trying to compare NAN'); + } elseif (!\is_finite($a) && !\is_finite($b) && $a === $b) { + return 0; + } + $diff = \abs($a - $b); + if ($diff < self::Epsilon || $diff / \max(\abs($a), \abs($b)) < self::Epsilon) { + return 0; + } + return $a < $b ? -1 : 1; + } + /** + * Returns true if $a = $b + * @throws \LogicException if one of parameters is NAN + */ + public static function areEqual(float $a, float $b) : bool + { + return self::compare($a, $b) === 0; + } + /** + * Returns true if $a < $b + * @throws \LogicException if one of parameters is NAN + */ + public static function isLessThan(float $a, float $b) : bool + { + return self::compare($a, $b) < 0; + } + /** + * Returns true if $a <= $b + * @throws \LogicException if one of parameters is NAN + */ + public static function isLessThanOrEqualTo(float $a, float $b) : bool + { + return self::compare($a, $b) <= 0; + } + /** + * Returns true if $a > $b + * @throws \LogicException if one of parameters is NAN + */ + public static function isGreaterThan(float $a, float $b) : bool + { + return self::compare($a, $b) > 0; + } + /** + * Returns true if $a >= $b + * @throws \LogicException if one of parameters is NAN + */ + public static function isGreaterThanOrEqualTo(float $a, float $b) : bool + { + return self::compare($a, $b) >= 0; + } +} diff --git a/vendor/nette/utils/src/Utils/Helpers.php b/vendor/nette/utils/src/Utils/Helpers.php new file mode 100644 index 00000000..3ac49798 --- /dev/null +++ b/vendor/nette/utils/src/Utils/Helpers.php @@ -0,0 +1,78 @@ + $max) { + throw new Nette\InvalidArgumentException("Minimum ({$min}) is not less than maximum ({$max})."); + } + return \min(\max($value, $min), $max); + } + /** + * Looks for a string from possibilities that is most similar to value, but not the same (for 8-bit encoding). + * @param string[] $possibilities + */ + public static function getSuggestion(array $possibilities, string $value) : ?string + { + $best = null; + $min = (\strlen($value) / 4 + 1) * 10 + 0.1; + foreach (\array_unique($possibilities) as $item) { + if ($item !== $value && ($len = \levenshtein($item, $value, 10, 11, 10)) < $min) { + $min = $len; + $best = $item; + } + } + return $best; + } +} diff --git a/vendor/nette/utils/src/Utils/Html.php b/vendor/nette/utils/src/Utils/Html.php new file mode 100644 index 00000000..9772d71b --- /dev/null +++ b/vendor/nette/utils/src/Utils/Html.php @@ -0,0 +1,744 @@ + element's attributes */ + public $attrs = []; + /** @var bool use XHTML syntax? */ + public static $xhtml = \false; + /** @var array void elements */ + public static $emptyElements = ['img' => 1, 'hr' => 1, 'br' => 1, 'input' => 1, 'meta' => 1, 'area' => 1, 'embed' => 1, 'keygen' => 1, 'source' => 1, 'base' => 1, 'col' => 1, 'link' => 1, 'param' => 1, 'basefont' => 1, 'frame' => 1, 'isindex' => 1, 'wbr' => 1, 'command' => 1, 'track' => 1]; + /** @var array nodes */ + protected $children = []; + /** @var string element's name */ + private $name; + /** @var bool is element empty? */ + private $isEmpty; + /** + * Constructs new HTML element. + * @param array|string $attrs element's attributes or plain text content + * @return static + */ + public static function el(?string $name = null, $attrs = null) + { + $el = new static(); + $parts = \explode(' ', (string) $name, 2); + $el->setName($parts[0]); + if (is_array($attrs)) { + $el->attrs = $attrs; + } elseif ($attrs !== null) { + $el->setText($attrs); + } + if (isset($parts[1])) { + foreach (Strings::matchAll($parts[1] . ' ', '#([a-z0-9:-]+)(?:=(["\'])?(.*?)(?(2)\\2|\\s))?#i') as $m) { + $el->attrs[$m[1]] = $m[3] ?? \true; + } + } + return $el; + } + /** + * Returns an object representing HTML text. + */ + public static function fromHtml(string $html) : self + { + return (new static())->setHtml($html); + } + /** + * Returns an object representing plain text. + */ + public static function fromText(string $text) : self + { + return (new static())->setText($text); + } + /** + * Converts to HTML. + */ + public final function toHtml() : string + { + return $this->render(); + } + /** + * Converts to plain text. + */ + public final function toText() : string + { + return $this->getText(); + } + /** + * Converts given HTML code to plain text. + */ + public static function htmlToText(string $html) : string + { + return \html_entity_decode(\strip_tags($html), \ENT_QUOTES | \ENT_HTML5, 'UTF-8'); + } + /** + * Changes element's name. + * @return static + */ + public final function setName(string $name, ?bool $isEmpty = null) + { + $this->name = $name; + $this->isEmpty = $isEmpty ?? isset(static::$emptyElements[$name]); + return $this; + } + /** + * Returns element's name. + */ + public final function getName() : string + { + return $this->name; + } + /** + * Is element empty? + */ + public final function isEmpty() : bool + { + return $this->isEmpty; + } + /** + * Sets multiple attributes. + * @return static + */ + public function addAttributes(array $attrs) + { + $this->attrs = \array_merge($this->attrs, $attrs); + return $this; + } + /** + * Appends value to element's attribute. + * @param mixed $value + * @param mixed $option + * @return static + */ + public function appendAttribute(string $name, $value, $option = \true) + { + if (is_array($value)) { + $prev = isset($this->attrs[$name]) ? (array) $this->attrs[$name] : []; + $this->attrs[$name] = $value + $prev; + } elseif ((string) $value === '') { + $tmp =& $this->attrs[$name]; + // appending empty value? -> ignore, but ensure it exists + } elseif (!isset($this->attrs[$name]) || is_array($this->attrs[$name])) { + // needs array + $this->attrs[$name][$value] = $option; + } else { + $this->attrs[$name] = [$this->attrs[$name] => \true, $value => $option]; + } + return $this; + } + /** + * Sets element's attribute. + * @param mixed $value + * @return static + */ + public function setAttribute(string $name, $value) + { + $this->attrs[$name] = $value; + return $this; + } + /** + * Returns element's attribute. + * @return mixed + */ + public function getAttribute(string $name) + { + return $this->attrs[$name] ?? null; + } + /** + * Unsets element's attribute. + * @return static + */ + public function removeAttribute(string $name) + { + unset($this->attrs[$name]); + return $this; + } + /** + * Unsets element's attributes. + * @return static + */ + public function removeAttributes(array $attributes) + { + foreach ($attributes as $name) { + unset($this->attrs[$name]); + } + return $this; + } + /** + * Overloaded setter for element's attribute. + * @param mixed $value + */ + public final function __set(string $name, $value) : void + { + $this->attrs[$name] = $value; + } + /** + * Overloaded getter for element's attribute. + * @return mixed + */ + public final function &__get(string $name) + { + return $this->attrs[$name]; + } + /** + * Overloaded tester for element's attribute. + */ + public final function __isset(string $name) : bool + { + return isset($this->attrs[$name]); + } + /** + * Overloaded unsetter for element's attribute. + */ + public final function __unset(string $name) : void + { + unset($this->attrs[$name]); + } + /** + * Overloaded setter for element's attribute. + * @return mixed + */ + public final function __call(string $m, array $args) + { + $p = \substr($m, 0, 3); + if ($p === 'get' || $p === 'set' || $p === 'add') { + $m = \substr($m, 3); + $m[0] = $m[0] | " "; + if ($p === 'get') { + return $this->attrs[$m] ?? null; + } elseif ($p === 'add') { + $args[] = \true; + } + } + if (\count($args) === 0) { + // invalid + } elseif (\count($args) === 1) { + // set + $this->attrs[$m] = $args[0]; + } else { + // add + $this->appendAttribute($m, $args[0], $args[1]); + } + return $this; + } + /** + * Special setter for element's attribute. + * @return static + */ + public final function href(string $path, ?array $query = null) + { + if ($query) { + $query = \http_build_query($query, '', '&'); + if ($query !== '') { + $path .= '?' . $query; + } + } + $this->attrs['href'] = $path; + return $this; + } + /** + * Setter for data-* attributes. Booleans are converted to 'true' resp. 'false'. + * @param mixed $value + * @return static + */ + public function data(string $name, $value = null) + { + if (\func_num_args() === 1) { + $this->attrs['data'] = $name; + } else { + $this->attrs["data-{$name}"] = \is_bool($value) ? \json_encode($value) : $value; + } + return $this; + } + /** + * Sets element's HTML content. + * @param HtmlStringable|string $html + * @return static + */ + public final function setHtml($html) + { + $this->children = [(string) $html]; + return $this; + } + /** + * Returns element's HTML content. + */ + public final function getHtml() : string + { + return \implode('', $this->children); + } + /** + * Sets element's textual content. + * @param HtmlStringable|string|int|float $text + * @return static + */ + public final function setText($text) + { + if (!$text instanceof HtmlStringable) { + $text = \htmlspecialchars((string) $text, \ENT_NOQUOTES, 'UTF-8'); + } + $this->children = [(string) $text]; + return $this; + } + /** + * Returns element's textual content. + */ + public final function getText() : string + { + return self::htmlToText($this->getHtml()); + } + /** + * Adds new element's child. + * @param HtmlStringable|string $child Html node or raw HTML string + * @return static + */ + public final function addHtml($child) + { + return $this->insert(null, $child); + } + /** + * Appends plain-text string to element content. + * @param HtmlStringable|string|int|float $text + * @return static + */ + public function addText($text) + { + if (!$text instanceof HtmlStringable) { + $text = \htmlspecialchars((string) $text, \ENT_NOQUOTES, 'UTF-8'); + } + return $this->insert(null, $text); + } + /** + * Creates and adds a new Html child. + * @param array|string $attrs element's attributes or raw HTML string + * @return static created element + */ + public final function create(string $name, $attrs = null) + { + $this->insert(null, $child = static::el($name, $attrs)); + return $child; + } + /** + * Inserts child node. + * @param HtmlStringable|string $child Html node or raw HTML string + * @return static + */ + public function insert(?int $index, $child, bool $replace = \false) + { + $child = $child instanceof self ? $child : (string) $child; + if ($index === null) { + // append + $this->children[] = $child; + } else { + // insert or replace + \array_splice($this->children, $index, $replace ? 1 : 0, [$child]); + } + return $this; + } + /** + * Inserts (replaces) child node (\ArrayAccess implementation). + * @param int|null $index position or null for appending + * @param Html|string $child Html node or raw HTML string + */ + public final function offsetSet($index, $child) : void + { + $this->insert($index, $child, \true); + } + /** + * Returns child node (\ArrayAccess implementation). + * @param int $index + * @return HtmlStringable|string + */ + #[\ReturnTypeWillChange] + public final function offsetGet($index) + { + return $this->children[$index]; + } + /** + * Exists child node? (\ArrayAccess implementation). + * @param int $index + */ + public final function offsetExists($index) : bool + { + return isset($this->children[$index]); + } + /** + * Removes child node (\ArrayAccess implementation). + * @param int $index + */ + public function offsetUnset($index) : void + { + if (isset($this->children[$index])) { + \array_splice($this->children, $index, 1); + } + } + /** + * Returns children count. + */ + public final function count() : int + { + return \count($this->children); + } + /** + * Removes all children. + */ + public function removeChildren() : void + { + $this->children = []; + } + /** + * Iterates over elements. + * @return \ArrayIterator + */ + public final function getIterator() : \ArrayIterator + { + return new \ArrayIterator($this->children); + } + /** + * Returns all children. + */ + public final function getChildren() : array + { + return $this->children; + } + /** + * Renders element's start tag, content and end tag. + */ + public final function render(?int $indent = null) : string + { + $s = $this->startTag(); + if (!$this->isEmpty) { + // add content + if ($indent !== null) { + $indent++; + } + foreach ($this->children as $child) { + if ($child instanceof self) { + $s .= $child->render($indent); + } else { + $s .= $child; + } + } + // add end tag + $s .= $this->endTag(); + } + if ($indent !== null) { + return "\n" . \str_repeat("\t", $indent - 1) . $s . "\n" . \str_repeat("\t", \max(0, $indent - 2)); + } + return $s; + } + public final function __toString() : string + { + try { + return $this->render(); + } catch (\Throwable $e) { + if (\PHP_VERSION_ID >= 70400) { + throw $e; + } + \trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", \E_USER_ERROR); + return ''; + } + } + /** + * Returns element's start tag. + */ + public final function startTag() : string + { + return $this->name ? '<' . $this->name . $this->attributes() . (static::$xhtml && $this->isEmpty ? ' />' : '>') : ''; + } + /** + * Returns element's end tag. + */ + public final function endTag() : string + { + return $this->name && !$this->isEmpty ? 'name . '>' : ''; + } + /** + * Returns element's attributes. + * @internal + */ + public final function attributes() : string + { + if (!is_array($this->attrs)) { + return ''; + } + $s = ''; + $attrs = $this->attrs; + foreach ($attrs as $key => $value) { + if ($value === null || $value === \false) { + continue; + } elseif ($value === \true) { + if (static::$xhtml) { + $s .= ' ' . $key . '="' . $key . '"'; + } else { + $s .= ' ' . $key; + } + continue; + } elseif (is_array($value)) { + if (\strncmp($key, 'data-', 5) === 0) { + $value = Json::encode($value); + } else { + $tmp = null; + foreach ($value as $k => $v) { + if ($v != null) { + // intentionally ==, skip nulls & empty string + // composite 'style' vs. 'others' + $tmp[] = $v === \true ? $k : (is_string($k) ? $k . ':' . $v : $v); + } + } + if ($tmp === null) { + continue; + } + $value = \implode($key === 'style' || !\strncmp($key, 'on', 2) ? ';' : ' ', $tmp); + } + } elseif (is_float($value)) { + $value = \rtrim(\rtrim(\number_format($value, 10, '.', ''), '0'), '.'); + } else { + $value = (string) $value; + } + $q = \strpos($value, '"') === \false ? '"' : "'"; + $s .= ' ' . $key . '=' . $q . \str_replace(['&', $q, '<'], ['&', $q === '"' ? '"' : ''', self::$xhtml ? '<' : '<'], $value) . (\strpos($value, '`') !== \false && \strpbrk($value, ' <>"\'') === \false ? ' ' : '') . $q; + } + $s = \str_replace('@', '@', $s); + return $s; + } + /** + * Clones all children too. + */ + public function __clone() + { + foreach ($this->children as $key => $value) { + if (is_object($value)) { + $this->children[$key] = clone $value; + } + } + } +} diff --git a/vendor/nette/utils/src/Utils/Image.php b/vendor/nette/utils/src/Utils/Image.php new file mode 100644 index 00000000..b701055f --- /dev/null +++ b/vendor/nette/utils/src/Utils/Image.php @@ -0,0 +1,611 @@ + + * $image = Image::fromFile('nette.jpg'); + * $image->resize(150, 100); + * $image->sharpen(); + * $image->send(); + * + * + * @method Image affine(array $affine, array $clip = null) + * @method array affineMatrixConcat(array $m1, array $m2) + * @method array affineMatrixGet(int $type, mixed $options = null) + * @method void alphaBlending(bool $on) + * @method void antialias(bool $on) + * @method void arc($x, $y, $w, $h, $start, $end, $color) + * @method void char(int $font, $x, $y, string $char, $color) + * @method void charUp(int $font, $x, $y, string $char, $color) + * @method int colorAllocate($red, $green, $blue) + * @method int colorAllocateAlpha($red, $green, $blue, $alpha) + * @method int colorAt($x, $y) + * @method int colorClosest($red, $green, $blue) + * @method int colorClosestAlpha($red, $green, $blue, $alpha) + * @method int colorClosestHWB($red, $green, $blue) + * @method void colorDeallocate($color) + * @method int colorExact($red, $green, $blue) + * @method int colorExactAlpha($red, $green, $blue, $alpha) + * @method void colorMatch(Image $image2) + * @method int colorResolve($red, $green, $blue) + * @method int colorResolveAlpha($red, $green, $blue, $alpha) + * @method void colorSet($index, $red, $green, $blue) + * @method array colorsForIndex($index) + * @method int colorsTotal() + * @method int colorTransparent($color = null) + * @method void convolution(array $matrix, float $div, float $offset) + * @method void copy(Image $src, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH) + * @method void copyMerge(Image $src, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH, $opacity) + * @method void copyMergeGray(Image $src, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH, $opacity) + * @method void copyResampled(Image $src, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH) + * @method void copyResized(Image $src, $dstX, $dstY, $srcX, $srcY, $dstW, $dstH, $srcW, $srcH) + * @method Image cropAuto(int $mode = -1, float $threshold = .5, int $color = -1) + * @method void ellipse($cx, $cy, $w, $h, $color) + * @method void fill($x, $y, $color) + * @method void filledArc($cx, $cy, $w, $h, $s, $e, $color, $style) + * @method void filledEllipse($cx, $cy, $w, $h, $color) + * @method void filledPolygon(array $points, $numPoints, $color) + * @method void filledRectangle($x1, $y1, $x2, $y2, $color) + * @method void fillToBorder($x, $y, $border, $color) + * @method void filter($filtertype) + * @method void flip(int $mode) + * @method array ftText($size, $angle, $x, $y, $col, string $fontFile, string $text, array $extrainfo = null) + * @method void gammaCorrect(float $inputgamma, float $outputgamma) + * @method array getClip() + * @method int interlace($interlace = null) + * @method bool isTrueColor() + * @method void layerEffect($effect) + * @method void line($x1, $y1, $x2, $y2, $color) + * @method void openPolygon(array $points, int $num_points, int $color) + * @method void paletteCopy(Image $source) + * @method void paletteToTrueColor() + * @method void polygon(array $points, $numPoints, $color) + * @method array psText(string $text, $font, $size, $color, $backgroundColor, $x, $y, $space = null, $tightness = null, float $angle = null, $antialiasSteps = null) + * @method void rectangle($x1, $y1, $x2, $y2, $col) + * @method mixed resolution(int $res_x = null, int $res_y = null) + * @method Image rotate(float $angle, $backgroundColor) + * @method void saveAlpha(bool $saveflag) + * @method Image scale(int $newWidth, int $newHeight = -1, int $mode = IMG_BILINEAR_FIXED) + * @method void setBrush(Image $brush) + * @method void setClip(int $x1, int $y1, int $x2, int $y2) + * @method void setInterpolation(int $method = IMG_BILINEAR_FIXED) + * @method void setPixel($x, $y, $color) + * @method void setStyle(array $style) + * @method void setThickness($thickness) + * @method void setTile(Image $tile) + * @method void string($font, $x, $y, string $s, $col) + * @method void stringUp($font, $x, $y, string $s, $col) + * @method void trueColorToPalette(bool $dither, $ncolors) + * @method array ttfText($size, $angle, $x, $y, $color, string $fontfile, string $text) + * @property-read positive-int $width + * @property-read positive-int $height + * @property-read resource|\GdImage $imageResource + */ +class Image +{ + use Nette\SmartObject; + /** Prevent from getting resized to a bigger size than the original */ + public const SHRINK_ONLY = 0b1; + /** Resizes to a specified width and height without keeping aspect ratio */ + public const STRETCH = 0b10; + /** Resizes to fit into a specified width and height and preserves aspect ratio */ + public const FIT = 0b0; + /** Resizes while bounding the smaller dimension to the specified width or height and preserves aspect ratio */ + public const FILL = 0b100; + /** Resizes to the smallest possible size to completely cover specified width and height and reserves aspect ratio */ + public const EXACT = 0b1000; + /** image types */ + public const JPEG = \IMAGETYPE_JPEG, PNG = \IMAGETYPE_PNG, GIF = \IMAGETYPE_GIF, WEBP = \IMAGETYPE_WEBP, AVIF = 19, BMP = \IMAGETYPE_BMP; + public const EMPTY_GIF = "GIF89a\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;"; + private const Formats = [self::JPEG => 'jpeg', self::PNG => 'png', self::GIF => 'gif', self::WEBP => 'webp', self::AVIF => 'avif', self::BMP => 'bmp']; + /** @var resource|\GdImage */ + private $image; + /** + * Returns RGB color (0..255) and transparency (0..127). + */ + public static function rgb(int $red, int $green, int $blue, int $transparency = 0) : array + { + return ['red' => \max(0, \min(255, $red)), 'green' => \max(0, \min(255, $green)), 'blue' => \max(0, \min(255, $blue)), 'alpha' => \max(0, \min(127, $transparency))]; + } + /** + * Reads an image from a file and returns its type in $type. + * @throws Nette\NotSupportedException if gd extension is not loaded + * @throws UnknownImageFileException if file not found or file type is not known + * @return static + */ + public static function fromFile(string $file, ?int &$type = null) + { + if (!\extension_loaded('gd')) { + throw new Nette\NotSupportedException('PHP extension GD is not loaded.'); + } + $type = self::detectTypeFromFile($file); + if (!$type) { + throw new UnknownImageFileException(\is_file($file) ? "Unknown type of file '{$file}'." : "File '{$file}' not found."); + } + return self::invokeSafe('imagecreatefrom' . self::Formats[$type], $file, "Unable to open file '{$file}'.", __METHOD__); + } + /** + * Reads an image from a string and returns its type in $type. + * @return static + * @throws Nette\NotSupportedException if gd extension is not loaded + * @throws ImageException + */ + public static function fromString(string $s, ?int &$type = null) + { + if (!\extension_loaded('gd')) { + throw new Nette\NotSupportedException('PHP extension GD is not loaded.'); + } + $type = self::detectTypeFromString($s); + if (!$type) { + throw new UnknownImageFileException('Unknown type of image.'); + } + return self::invokeSafe('imagecreatefromstring', $s, 'Unable to open image from string.', __METHOD__); + } + private static function invokeSafe(string $func, string $arg, string $message, string $callee) : self + { + $errors = []; + $res = Callback::invokeSafe($func, [$arg], function (string $message) use(&$errors) : void { + $errors[] = $message; + }); + if (!$res) { + throw new ImageException($message . ' Errors: ' . \implode(', ', $errors)); + } elseif ($errors) { + \trigger_error($callee . '(): ' . \implode(', ', $errors), \E_USER_WARNING); + } + return new static($res); + } + /** + * Creates a new true color image of the given dimensions. The default color is black. + * @param positive-int $width + * @param positive-int $height + * @return static + * @throws Nette\NotSupportedException if gd extension is not loaded + */ + public static function fromBlank(int $width, int $height, ?array $color = null) + { + if (!\extension_loaded('gd')) { + throw new Nette\NotSupportedException('PHP extension GD is not loaded.'); + } + if ($width < 1 || $height < 1) { + throw new Nette\InvalidArgumentException('Image width and height must be greater than zero.'); + } + $image = \imagecreatetruecolor($width, $height); + if ($color) { + $color += ['alpha' => 0]; + $color = \imagecolorresolvealpha($image, $color['red'], $color['green'], $color['blue'], $color['alpha']); + \imagealphablending($image, \false); + \imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $color); + \imagealphablending($image, \true); + } + return new static($image); + } + /** + * Returns the type of image from file. + */ + public static function detectTypeFromFile(string $file, &$width = null, &$height = null) : ?int + { + [$width, $height, $type] = @\getimagesize($file); + // @ - files smaller than 12 bytes causes read error + return isset(self::Formats[$type]) ? $type : null; + } + /** + * Returns the type of image from string. + */ + public static function detectTypeFromString(string $s, &$width = null, &$height = null) : ?int + { + [$width, $height, $type] = @\getimagesizefromstring($s); + // @ - strings smaller than 12 bytes causes read error + return isset(self::Formats[$type]) ? $type : null; + } + /** + * Returns the file extension for the given `Image::XXX` constant. + */ + public static function typeToExtension(int $type) : string + { + if (!isset(self::Formats[$type])) { + throw new Nette\InvalidArgumentException("Unsupported image type '{$type}'."); + } + return self::Formats[$type]; + } + /** + * Returns the `Image::XXX` constant for given file extension. + */ + public static function extensionToType(string $extension) : int + { + $extensions = \array_flip(self::Formats) + ['jpg' => self::JPEG]; + $extension = \strtolower($extension); + if (!isset($extensions[$extension])) { + throw new Nette\InvalidArgumentException("Unsupported file extension '{$extension}'."); + } + return $extensions[$extension]; + } + /** + * Returns the mime type for the given `Image::XXX` constant. + */ + public static function typeToMimeType(int $type) : string + { + return 'image/' . self::typeToExtension($type); + } + /** + * Wraps GD image. + * @param resource|\GdImage $image + */ + public function __construct($image) + { + $this->setImageResource($image); + \imagesavealpha($image, \true); + } + /** + * Returns image width. + * @return positive-int + */ + public function getWidth() : int + { + return \imagesx($this->image); + } + /** + * Returns image height. + * @return positive-int + */ + public function getHeight() : int + { + return \imagesy($this->image); + } + /** + * Sets image resource. + * @param resource|\GdImage $image + * @return static + */ + protected function setImageResource($image) + { + if (!$image instanceof \GdImage && !(\is_resource($image) && \get_resource_type($image) === 'gd')) { + throw new Nette\InvalidArgumentException('Image is not valid.'); + } + $this->image = $image; + return $this; + } + /** + * Returns image GD resource. + * @return resource|\GdImage + */ + public function getImageResource() + { + return $this->image; + } + /** + * Scales an image. + * @param int|string|null $width in pixels or percent + * @param int|string|null $height in pixels or percent + * @return static + */ + public function resize($width, $height, int $flags = self::FIT) + { + if ($flags & self::EXACT) { + return $this->resize($width, $height, self::FILL)->crop('50%', '50%', $width, $height); + } + [$newWidth, $newHeight] = static::calculateSize($this->getWidth(), $this->getHeight(), $width, $height, $flags); + if ($newWidth !== $this->getWidth() || $newHeight !== $this->getHeight()) { + // resize + $newImage = static::fromBlank($newWidth, $newHeight, self::rgb(0, 0, 0, 127))->getImageResource(); + \imagecopyresampled($newImage, $this->image, 0, 0, 0, 0, $newWidth, $newHeight, $this->getWidth(), $this->getHeight()); + $this->image = $newImage; + } + if ($width < 0 || $height < 0) { + \imageflip($this->image, $width < 0 ? $height < 0 ? \IMG_FLIP_BOTH : \IMG_FLIP_HORIZONTAL : \IMG_FLIP_VERTICAL); + } + return $this; + } + /** + * Calculates dimensions of resized image. + * @param int|string|null $newWidth in pixels or percent + * @param int|string|null $newHeight in pixels or percent + */ + public static function calculateSize(int $srcWidth, int $srcHeight, $newWidth, $newHeight, int $flags = self::FIT) : array + { + if ($newWidth === null) { + } elseif (self::isPercent($newWidth)) { + $newWidth = (int) \round($srcWidth / 100 * \abs($newWidth)); + $percents = \true; + } else { + $newWidth = \abs($newWidth); + } + if ($newHeight === null) { + } elseif (self::isPercent($newHeight)) { + $newHeight = (int) \round($srcHeight / 100 * \abs($newHeight)); + $flags |= empty($percents) ? 0 : self::STRETCH; + } else { + $newHeight = \abs($newHeight); + } + if ($flags & self::STRETCH) { + // non-proportional + if (!$newWidth || !$newHeight) { + throw new Nette\InvalidArgumentException('For stretching must be both width and height specified.'); + } + if ($flags & self::SHRINK_ONLY) { + $newWidth = (int) \round($srcWidth * \min(1, $newWidth / $srcWidth)); + $newHeight = (int) \round($srcHeight * \min(1, $newHeight / $srcHeight)); + } + } else { + // proportional + if (!$newWidth && !$newHeight) { + throw new Nette\InvalidArgumentException('At least width or height must be specified.'); + } + $scale = []; + if ($newWidth > 0) { + // fit width + $scale[] = $newWidth / $srcWidth; + } + if ($newHeight > 0) { + // fit height + $scale[] = $newHeight / $srcHeight; + } + if ($flags & self::FILL) { + $scale = [\max($scale)]; + } + if ($flags & self::SHRINK_ONLY) { + $scale[] = 1; + } + $scale = \min($scale); + $newWidth = (int) \round($srcWidth * $scale); + $newHeight = (int) \round($srcHeight * $scale); + } + return [\max($newWidth, 1), \max($newHeight, 1)]; + } + /** + * Crops image. + * @param int|string $left in pixels or percent + * @param int|string $top in pixels or percent + * @param int|string $width in pixels or percent + * @param int|string $height in pixels or percent + * @return static + */ + public function crop($left, $top, $width, $height) + { + [$r['x'], $r['y'], $r['width'], $r['height']] = static::calculateCutout($this->getWidth(), $this->getHeight(), $left, $top, $width, $height); + if (\gd_info()['GD Version'] === 'bundled (2.1.0 compatible)') { + $this->image = \imagecrop($this->image, $r); + \imagesavealpha($this->image, \true); + } else { + $newImage = static::fromBlank($r['width'], $r['height'], self::RGB(0, 0, 0, 127))->getImageResource(); + \imagecopy($newImage, $this->image, 0, 0, $r['x'], $r['y'], $r['width'], $r['height']); + $this->image = $newImage; + } + return $this; + } + /** + * Calculates dimensions of cutout in image. + * @param int|string $left in pixels or percent + * @param int|string $top in pixels or percent + * @param int|string $newWidth in pixels or percent + * @param int|string $newHeight in pixels or percent + */ + public static function calculateCutout(int $srcWidth, int $srcHeight, $left, $top, $newWidth, $newHeight) : array + { + if (self::isPercent($newWidth)) { + $newWidth = (int) \round($srcWidth / 100 * $newWidth); + } + if (self::isPercent($newHeight)) { + $newHeight = (int) \round($srcHeight / 100 * $newHeight); + } + if (self::isPercent($left)) { + $left = (int) \round(($srcWidth - $newWidth) / 100 * $left); + } + if (self::isPercent($top)) { + $top = (int) \round(($srcHeight - $newHeight) / 100 * $top); + } + if ($left < 0) { + $newWidth += $left; + $left = 0; + } + if ($top < 0) { + $newHeight += $top; + $top = 0; + } + $newWidth = \min($newWidth, $srcWidth - $left); + $newHeight = \min($newHeight, $srcHeight - $top); + return [$left, $top, $newWidth, $newHeight]; + } + /** + * Sharpens image a little bit. + * @return static + */ + public function sharpen() + { + \imageconvolution($this->image, [ + // my magic numbers ;) + [-1, -1, -1], + [-1, 24, -1], + [-1, -1, -1], + ], 16, 0); + return $this; + } + /** + * Puts another image into this image. + * @param int|string $left in pixels or percent + * @param int|string $top in pixels or percent + * @param int<0, 100> $opacity 0..100 + * @return static + */ + public function place(self $image, $left = 0, $top = 0, int $opacity = 100) + { + $opacity = \max(0, \min(100, $opacity)); + if ($opacity === 0) { + return $this; + } + $width = $image->getWidth(); + $height = $image->getHeight(); + if (self::isPercent($left)) { + $left = (int) \round(($this->getWidth() - $width) / 100 * $left); + } + if (self::isPercent($top)) { + $top = (int) \round(($this->getHeight() - $height) / 100 * $top); + } + $output = $input = $image->image; + if ($opacity < 100) { + $tbl = []; + for ($i = 0; $i < 128; $i++) { + $tbl[$i] = \round(127 - (127 - $i) * $opacity / 100); + } + $output = \imagecreatetruecolor($width, $height); + \imagealphablending($output, \false); + if (!$image->isTrueColor()) { + $input = $output; + \imagefilledrectangle($output, 0, 0, $width, $height, \imagecolorallocatealpha($output, 0, 0, 0, 127)); + \imagecopy($output, $image->image, 0, 0, 0, 0, $width, $height); + } + for ($x = 0; $x < $width; $x++) { + for ($y = 0; $y < $height; $y++) { + $c = \imagecolorat($input, $x, $y); + $c = ($c & 0xffffff) + ($tbl[$c >> 24] << 24); + \imagesetpixel($output, $x, $y, $c); + } + } + \imagealphablending($output, \true); + } + \imagecopy($this->image, $output, $left, $top, 0, 0, $width, $height); + return $this; + } + /** + * Saves image to the file. Quality is in the range 0..100 for JPEG (default 85), WEBP (default 80) and AVIF (default 30) and 0..9 for PNG (default 9). + * @throws ImageException + */ + public function save(string $file, ?int $quality = null, ?int $type = null) : void + { + $type = $type ?? self::extensionToType(\pathinfo($file, \PATHINFO_EXTENSION)); + $this->output($type, $quality, $file); + } + /** + * Outputs image to string. Quality is in the range 0..100 for JPEG (default 85), WEBP (default 80) and AVIF (default 30) and 0..9 for PNG (default 9). + */ + public function toString(int $type = self::JPEG, ?int $quality = null) : string + { + return Helpers::capture(function () use($type, $quality) { + $this->output($type, $quality); + }); + } + /** + * Outputs image to string. + */ + public function __toString() : string + { + try { + return $this->toString(); + } catch (\Throwable $e) { + if (\func_num_args() || \PHP_VERSION_ID >= 70400) { + throw $e; + } + \trigger_error('Exception in ' . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", \E_USER_ERROR); + return ''; + } + } + /** + * Outputs image to browser. Quality is in the range 0..100 for JPEG (default 85), WEBP (default 80) and AVIF (default 30) and 0..9 for PNG (default 9). + * @throws ImageException + */ + public function send(int $type = self::JPEG, ?int $quality = null) : void + { + \header('Content-Type: ' . self::typeToMimeType($type)); + $this->output($type, $quality); + } + /** + * Outputs image to browser or file. + * @throws ImageException + */ + private function output(int $type, ?int $quality, ?string $file = null) : void + { + switch ($type) { + case self::JPEG: + $quality = $quality === null ? 85 : \max(0, \min(100, $quality)); + $success = @\imagejpeg($this->image, $file, $quality); + // @ is escalated to exception + break; + case self::PNG: + $quality = $quality === null ? 9 : \max(0, \min(9, $quality)); + $success = @\imagepng($this->image, $file, $quality); + // @ is escalated to exception + break; + case self::GIF: + $success = @\imagegif($this->image, $file); + // @ is escalated to exception + break; + case self::WEBP: + $quality = $quality === null ? 80 : \max(0, \min(100, $quality)); + $success = @\imagewebp($this->image, $file, $quality); + // @ is escalated to exception + break; + case self::AVIF: + $quality = $quality === null ? 30 : \max(0, \min(100, $quality)); + $success = @\imageavif($this->image, $file, $quality); + // @ is escalated to exception + break; + case self::BMP: + $success = @\imagebmp($this->image, $file); + // @ is escalated to exception + break; + default: + throw new Nette\InvalidArgumentException("Unsupported image type '{$type}'."); + } + if (!$success) { + throw new ImageException(Helpers::getLastError() ?: 'Unknown error'); + } + } + /** + * Call to undefined method. + * @return mixed + * @throws Nette\MemberAccessException + */ + public function __call(string $name, array $args) + { + $function = 'image' . $name; + if (!\function_exists($function)) { + ObjectHelpers::strictCall(static::class, $name); + } + foreach ($args as $key => $value) { + if ($value instanceof self) { + $args[$key] = $value->getImageResource(); + } elseif (\is_array($value) && isset($value['red'])) { + // rgb + $args[$key] = \imagecolorallocatealpha($this->image, $value['red'], $value['green'], $value['blue'], $value['alpha']) ?: \imagecolorresolvealpha($this->image, $value['red'], $value['green'], $value['blue'], $value['alpha']); + } + } + $res = $function($this->image, ...$args); + return $res instanceof \GdImage || \is_resource($res) && \get_resource_type($res) === 'gd' ? $this->setImageResource($res) : $res; + } + public function __clone() + { + \ob_start(function () { + }); + \imagepng($this->image, null, 0); + $this->setImageResource(\imagecreatefromstring(\ob_get_clean())); + } + /** + * @param int|string $num in pixels or percent + */ + private static function isPercent(&$num) : bool + { + if (\is_string($num) && \substr($num, -1) === '%') { + $num = (float) \substr($num, 0, -1); + return \true; + } elseif (\is_int($num) || $num === (string) (int) $num) { + $num = (int) $num; + return \false; + } + throw new Nette\InvalidArgumentException("Expected dimension in int|string, '{$num}' given."); + } + /** + * Prevents serialization. + */ + public function __sleep() : array + { + throw new Nette\NotSupportedException('You cannot serialize or unserialize ' . self::class . ' instances.'); + } +} diff --git a/vendor/nette/utils/src/Utils/Json.php b/vendor/nette/utils/src/Utils/Json.php new file mode 100644 index 00000000..807b2fd8 --- /dev/null +++ b/vendor/nette/utils/src/Utils/Json.php @@ -0,0 +1,49 @@ +getProperties(\ReflectionProperty::IS_PUBLIC), function ($p) { + return !$p->isStatic(); + }), self::parseFullDoc($rc, '~^[ \\t*]*@property(?:-read)?[ \\t]+(?:\\S+[ \\t]+)??\\$(\\w+)~m')), $name); + throw new MemberAccessException("Cannot read an undeclared property {$class}::\${$name}" . ($hint ? ", did you mean \${$hint}?" : '.')); + } + /** + * @return never + * @throws MemberAccessException + */ + public static function strictSet(string $class, string $name) : void + { + $rc = new \ReflectionClass($class); + $hint = self::getSuggestion(\array_merge(\array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), function ($p) { + return !$p->isStatic(); + }), self::parseFullDoc($rc, '~^[ \\t*]*@property(?:-write)?[ \\t]+(?:\\S+[ \\t]+)??\\$(\\w+)~m')), $name); + throw new MemberAccessException("Cannot write to an undeclared property {$class}::\${$name}" . ($hint ? ", did you mean \${$hint}?" : '.')); + } + /** + * @return never + * @throws MemberAccessException + */ + public static function strictCall(string $class, string $method, array $additionalMethods = []) : void + { + $trace = \debug_backtrace(0, 3); + // suppose this method is called from __call() + $context = ($trace[1]['function'] ?? null) === '__call' ? $trace[2]['class'] ?? null : null; + if ($context && \is_a($class, $context, \true) && \method_exists($context, $method)) { + // called parent::$method() + $class = \get_parent_class($context); + } + if (\method_exists($class, $method)) { + // insufficient visibility + $rm = new \ReflectionMethod($class, $method); + $visibility = $rm->isPrivate() ? 'private ' : ($rm->isProtected() ? 'protected ' : ''); + throw new MemberAccessException("Call to {$visibility}method {$class}::{$method}() from " . ($context ? "scope {$context}." : 'global scope.')); + } else { + $hint = self::getSuggestion(\array_merge(\get_class_methods($class), self::parseFullDoc(new \ReflectionClass($class), '~^[ \\t*]*@method[ \\t]+(?:static[ \\t]+)?(?:\\S+[ \\t]+)??(\\w+)\\(~m'), $additionalMethods), $method); + throw new MemberAccessException("Call to undefined method {$class}::{$method}()" . ($hint ? ", did you mean {$hint}()?" : '.')); + } + } + /** + * @return never + * @throws MemberAccessException + */ + public static function strictStaticCall(string $class, string $method) : void + { + $trace = \debug_backtrace(0, 3); + // suppose this method is called from __callStatic() + $context = ($trace[1]['function'] ?? null) === '__callStatic' ? $trace[2]['class'] ?? null : null; + if ($context && \is_a($class, $context, \true) && \method_exists($context, $method)) { + // called parent::$method() + $class = \get_parent_class($context); + } + if (\method_exists($class, $method)) { + // insufficient visibility + $rm = new \ReflectionMethod($class, $method); + $visibility = $rm->isPrivate() ? 'private ' : ($rm->isProtected() ? 'protected ' : ''); + throw new MemberAccessException("Call to {$visibility}method {$class}::{$method}() from " . ($context ? "scope {$context}." : 'global scope.')); + } else { + $hint = self::getSuggestion(\array_filter((new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC), function ($m) { + return $m->isStatic(); + }), $method); + throw new MemberAccessException("Call to undefined static method {$class}::{$method}()" . ($hint ? ", did you mean {$hint}()?" : '.')); + } + } + /** + * Returns array of magic properties defined by annotation @property. + * @return array of [name => bit mask] + * @internal + */ + public static function getMagicProperties(string $class) : array + { + static $cache; + $props =& $cache[$class]; + if ($props !== null) { + return $props; + } + $rc = new \ReflectionClass($class); + \preg_match_all('~^ [ \\t*]* @property(|-read|-write|-deprecated) [ \\t]+ [^\\s$]+ [ \\t]+ \\$ (\\w+) ()~mx', (string) $rc->getDocComment(), $matches, \PREG_SET_ORDER); + $props = []; + foreach ($matches as [, $type, $name]) { + $uname = \ucfirst($name); + $write = $type !== '-read' && $rc->hasMethod($nm = 'set' . $uname) && ($rm = $rc->getMethod($nm))->name === $nm && !$rm->isPrivate() && !$rm->isStatic(); + $read = $type !== '-write' && ($rc->hasMethod($nm = 'get' . $uname) || $rc->hasMethod($nm = 'is' . $uname)) && ($rm = $rc->getMethod($nm))->name === $nm && !$rm->isPrivate() && !$rm->isStatic(); + if ($read || $write) { + $props[$name] = $read << 0 | ($nm[0] === 'g') << 1 | $rm->returnsReference() << 2 | $write << 3 | ($type === '-deprecated') << 4; + } + } + foreach ($rc->getTraits() as $trait) { + $props += self::getMagicProperties($trait->name); + } + if ($parent = \get_parent_class($class)) { + $props += self::getMagicProperties($parent); + } + return $props; + } + /** + * Finds the best suggestion (for 8-bit encoding). + * @param (\ReflectionFunctionAbstract|\ReflectionParameter|\ReflectionClass|\ReflectionProperty|string)[] $possibilities + * @internal + */ + public static function getSuggestion(array $possibilities, string $value) : ?string + { + $norm = \preg_replace($re = '#^(get|set|has|is|add)(?=[A-Z])#', '+', $value); + $best = null; + $min = (\strlen($value) / 4 + 1) * 10 + 0.1; + foreach (\array_unique($possibilities, \SORT_REGULAR) as $item) { + $item = $item instanceof \Reflector ? $item->name : $item; + if ($item !== $value && (($len = \levenshtein($item, $value, 10, 11, 10)) < $min || ($len = \levenshtein(\preg_replace($re, '*', $item), $norm, 10, 11, 10)) < $min)) { + $min = $len; + $best = $item; + } + } + return $best; + } + private static function parseFullDoc(\ReflectionClass $rc, string $pattern) : array + { + do { + $doc[] = $rc->getDocComment(); + $traits = $rc->getTraits(); + while ($trait = \array_pop($traits)) { + $doc[] = $trait->getDocComment(); + $traits += $trait->getTraits(); + } + } while ($rc = $rc->getParentClass()); + return \preg_match_all($pattern, \implode($doc), $m) ? $m[1] : []; + } + /** + * Checks if the public non-static property exists. + * @return bool|string returns 'event' if the property exists and has event like name + * @internal + */ + public static function hasProperty(string $class, string $name) + { + static $cache; + $prop =& $cache[$class][$name]; + if ($prop === null) { + $prop = \false; + try { + $rp = new \ReflectionProperty($class, $name); + $rp->setAccessible(\true); + if ($rp->isPublic() && !$rp->isStatic()) { + $prop = $name >= 'onA' && $name < 'on_' ? 'event' : \true; + } + } catch (\ReflectionException $e) { + } + } + return $prop; + } +} diff --git a/vendor/nette/utils/src/Utils/ObjectMixin.php b/vendor/nette/utils/src/Utils/ObjectMixin.php new file mode 100644 index 00000000..891d99d0 --- /dev/null +++ b/vendor/nette/utils/src/Utils/ObjectMixin.php @@ -0,0 +1,32 @@ + $firstItemOnPage + * @property-read int<0,max> $lastItemOnPage + * @property int $base + * @property-read bool $first + * @property-read bool $last + * @property-read int<0,max>|null $pageCount + * @property positive-int $itemsPerPage + * @property int<0,max>|null $itemCount + * @property-read int<0,max> $offset + * @property-read int<0,max>|null $countdownOffset + * @property-read int<0,max> $length + */ +class Paginator +{ + use Nette\SmartObject; + /** @var int */ + private $base = 1; + /** @var int */ + private $itemsPerPage = 1; + /** @var int */ + private $page = 1; + /** @var int|null */ + private $itemCount; + /** + * Sets current page number. + * @return static + */ + public function setPage(int $page) + { + $this->page = $page; + return $this; + } + /** + * Returns current page number. + */ + public function getPage() : int + { + return $this->base + $this->getPageIndex(); + } + /** + * Returns first page number. + */ + public function getFirstPage() : int + { + return $this->base; + } + /** + * Returns last page number. + */ + public function getLastPage() : ?int + { + return $this->itemCount === null ? null : $this->base + \max(0, $this->getPageCount() - 1); + } + /** + * Returns the sequence number of the first element on the page + * @return int<0, max> + */ + public function getFirstItemOnPage() : int + { + return $this->itemCount !== 0 ? $this->offset + 1 : 0; + } + /** + * Returns the sequence number of the last element on the page + * @return int<0, max> + */ + public function getLastItemOnPage() : int + { + return $this->offset + $this->length; + } + /** + * Sets first page (base) number. + * @return static + */ + public function setBase(int $base) + { + $this->base = $base; + return $this; + } + /** + * Returns first page (base) number. + */ + public function getBase() : int + { + return $this->base; + } + /** + * Returns zero-based page number. + * @return int<0, max> + */ + protected function getPageIndex() : int + { + $index = \max(0, $this->page - $this->base); + return $this->itemCount === null ? $index : \min($index, \max(0, $this->getPageCount() - 1)); + } + /** + * Is the current page the first one? + */ + public function isFirst() : bool + { + return $this->getPageIndex() === 0; + } + /** + * Is the current page the last one? + */ + public function isLast() : bool + { + return $this->itemCount === null ? \false : $this->getPageIndex() >= $this->getPageCount() - 1; + } + /** + * Returns the total number of pages. + * @return int<0, max>|null + */ + public function getPageCount() : ?int + { + return $this->itemCount === null ? null : (int) \ceil($this->itemCount / $this->itemsPerPage); + } + /** + * Sets the number of items to display on a single page. + * @return static + */ + public function setItemsPerPage(int $itemsPerPage) + { + $this->itemsPerPage = \max(1, $itemsPerPage); + return $this; + } + /** + * Returns the number of items to display on a single page. + * @return positive-int + */ + public function getItemsPerPage() : int + { + return $this->itemsPerPage; + } + /** + * Sets the total number of items. + * @return static + */ + public function setItemCount(?int $itemCount = null) + { + $this->itemCount = $itemCount === null ? null : \max(0, $itemCount); + return $this; + } + /** + * Returns the total number of items. + * @return int<0, max>|null + */ + public function getItemCount() : ?int + { + return $this->itemCount; + } + /** + * Returns the absolute index of the first item on current page. + * @return int<0, max> + */ + public function getOffset() : int + { + return $this->getPageIndex() * $this->itemsPerPage; + } + /** + * Returns the absolute index of the first item on current page in countdown paging. + * @return int<0, max>|null + */ + public function getCountdownOffset() : ?int + { + return $this->itemCount === null ? null : \max(0, $this->itemCount - ($this->getPageIndex() + 1) * $this->itemsPerPage); + } + /** + * Returns the number of items on current page. + * @return int<0, max> + */ + public function getLength() : int + { + return $this->itemCount === null ? $this->itemsPerPage : \min($this->itemsPerPage, $this->itemCount - $this->getPageIndex() * $this->itemsPerPage); + } +} diff --git a/vendor/nette/utils/src/Utils/Random.php b/vendor/nette/utils/src/Utils/Random.php new file mode 100644 index 00000000..2b7c1959 --- /dev/null +++ b/vendor/nette/utils/src/Utils/Random.php @@ -0,0 +1,38 @@ +getReturnType() ?? (\PHP_VERSION_ID >= 80100 && $func instanceof \ReflectionMethod ? $func->getTentativeReturnType() : null); + return self::getType($func, $type); + } + /** + * @deprecated + */ + public static function getReturnTypes(\ReflectionFunctionAbstract $func) : array + { + $type = Type::fromReflection($func); + return $type ? $type->getNames() : []; + } + /** + * Returns the type of given parameter and normalizes `self` and `parent` to the actual class names. + * If the parameter does not have a type, it returns null. + * If the parameter has union or intersection type, it throws Nette\InvalidStateException. + * @deprecated use Nette\Utils\Type::fromReflection() + */ + public static function getParameterType(\ReflectionParameter $param) : ?string + { + return self::getType($param, $param->getType()); + } + /** + * @deprecated + */ + public static function getParameterTypes(\ReflectionParameter $param) : array + { + $type = Type::fromReflection($param); + return $type ? $type->getNames() : []; + } + /** + * Returns the type of given property and normalizes `self` and `parent` to the actual class names. + * If the property does not have a type, it returns null. + * If the property has union or intersection type, it throws Nette\InvalidStateException. + * @deprecated use Nette\Utils\Type::fromReflection() + */ + public static function getPropertyType(\ReflectionProperty $prop) : ?string + { + return self::getType($prop, \PHP_VERSION_ID >= 70400 ? \method_exists($prop, 'getType') ? $prop->getType() : null : null); + } + /** + * @deprecated + */ + public static function getPropertyTypes(\ReflectionProperty $prop) : array + { + $type = Type::fromReflection($prop); + return $type ? $type->getNames() : []; + } + /** + * @param \ReflectionFunction|\ReflectionMethod|\ReflectionParameter|\ReflectionProperty $reflection + */ + private static function getType($reflection, ?\ReflectionType $type) : ?string + { + if ($type === null) { + return null; + } elseif ($type instanceof \ReflectionNamedType) { + return Type::resolve($type->getName(), $reflection); + } elseif ($type instanceof \ReflectionUnionType || $type instanceof \ReflectionIntersectionType) { + throw new Nette\InvalidStateException('The ' . self::toString($reflection) . ' is not expected to have a union or intersection type.'); + } else { + throw new Nette\InvalidStateException('Unexpected type of ' . self::toString($reflection)); + } + } + /** + * Returns the default value of parameter. If it is a constant, it returns its value. + * @return mixed + * @throws \ReflectionException If the parameter does not have a default value or the constant cannot be resolved + */ + public static function getParameterDefaultValue(\ReflectionParameter $param) + { + if ($param->isDefaultValueConstant()) { + $const = $orig = $param->getDefaultValueConstantName(); + $pair = \explode('::', $const); + if (isset($pair[1])) { + $pair[0] = Type::resolve($pair[0], $param); + try { + $rcc = new \ReflectionClassConstant($pair[0], $pair[1]); + } catch (\ReflectionException $e) { + $name = self::toString($param); + throw new \ReflectionException("Unable to resolve constant {$orig} used as default value of {$name}.", 0, $e); + } + return $rcc->getValue(); + } elseif (!\defined($const)) { + $const = \substr((string) \strrchr($const, '\\'), 1); + if (!\defined($const)) { + $name = self::toString($param); + throw new \ReflectionException("Unable to resolve constant {$orig} used as default value of {$name}."); + } + } + return \constant($const); + } + return $param->getDefaultValue(); + } + /** + * Returns a reflection of a class or trait that contains a declaration of given property. Property can also be declared in the trait. + */ + public static function getPropertyDeclaringClass(\ReflectionProperty $prop) : \ReflectionClass + { + foreach ($prop->getDeclaringClass()->getTraits() as $trait) { + if ($trait->hasProperty($prop->name) && $trait->getProperty($prop->name)->getDocComment() === $prop->getDocComment()) { + return self::getPropertyDeclaringClass($trait->getProperty($prop->name)); + } + } + return $prop->getDeclaringClass(); + } + /** + * Returns a reflection of a method that contains a declaration of $method. + * Usually, each method is its own declaration, but the body of the method can also be in the trait and under a different name. + */ + public static function getMethodDeclaringMethod(\ReflectionMethod $method) : \ReflectionMethod + { + // file & line guessing as workaround for insufficient PHP reflection + $decl = $method->getDeclaringClass(); + if ($decl->getFileName() === $method->getFileName() && $decl->getStartLine() <= $method->getStartLine() && $decl->getEndLine() >= $method->getEndLine()) { + return $method; + } + $hash = [$method->getFileName(), $method->getStartLine(), $method->getEndLine()]; + if (($alias = $decl->getTraitAliases()[$method->name] ?? null) && ($m = new \ReflectionMethod($alias)) && $hash === [$m->getFileName(), $m->getStartLine(), $m->getEndLine()]) { + return self::getMethodDeclaringMethod($m); + } + foreach ($decl->getTraits() as $trait) { + if ($trait->hasMethod($method->name) && ($m = $trait->getMethod($method->name)) && $hash === [$m->getFileName(), $m->getStartLine(), $m->getEndLine()]) { + return self::getMethodDeclaringMethod($m); + } + } + return $method; + } + /** + * Finds out if reflection has access to PHPdoc comments. Comments may not be available due to the opcode cache. + */ + public static function areCommentsAvailable() : bool + { + static $res; + return $res ?? ($res = (bool) (new \ReflectionMethod(__METHOD__))->getDocComment()); + } + public static function toString(\Reflector $ref) : string + { + if ($ref instanceof \ReflectionClass) { + return $ref->name; + } elseif ($ref instanceof \ReflectionMethod) { + return $ref->getDeclaringClass()->name . '::' . $ref->name . '()'; + } elseif ($ref instanceof \ReflectionFunction) { + return $ref->name . '()'; + } elseif ($ref instanceof \ReflectionProperty) { + return self::getPropertyDeclaringClass($ref)->name . '::$' . $ref->name; + } elseif ($ref instanceof \ReflectionParameter) { + return '$' . $ref->name . ' in ' . self::toString($ref->getDeclaringFunction()); + } else { + throw new Nette\InvalidArgumentException(); + } + } + /** + * Expands the name of the class to full name in the given context of given class. + * Thus, it returns how the PHP parser would understand $name if it were written in the body of the class $context. + * @throws Nette\InvalidArgumentException + */ + public static function expandClassName(string $name, \ReflectionClass $context) : string + { + $lower = \strtolower($name); + if (empty($name)) { + throw new Nette\InvalidArgumentException('Class name must not be empty.'); + } elseif (Validators::isBuiltinType($lower)) { + return $lower; + } elseif ($lower === 'self' || $lower === 'static') { + return $context->name; + } elseif ($lower === 'parent') { + return $context->getParentClass() ? $context->getParentClass()->name : 'parent'; + } elseif ($name[0] === '\\') { + // fully qualified name + return \ltrim($name, '\\'); + } + $uses = self::getUseStatements($context); + $parts = \explode('\\', $name, 2); + if (isset($uses[$parts[0]])) { + $parts[0] = $uses[$parts[0]]; + return \implode('\\', $parts); + } elseif ($context->inNamespace()) { + return $context->getNamespaceName() . '\\' . $name; + } else { + return $name; + } + } + /** @return array of [alias => class] */ + public static function getUseStatements(\ReflectionClass $class) : array + { + if ($class->isAnonymous()) { + throw new Nette\NotImplementedException('Anonymous classes are not supported.'); + } + static $cache = []; + if (!isset($cache[$name = $class->name])) { + if ($class->isInternal()) { + $cache[$name] = []; + } else { + $code = \file_get_contents($class->getFileName()); + $cache = self::parseUseStatements($code, $name) + $cache; + } + } + return $cache[$name]; + } + /** + * Parses PHP code to [class => [alias => class, ...]] + */ + private static function parseUseStatements(string $code, ?string $forClass = null) : array + { + try { + $tokens = \token_get_all($code, \TOKEN_PARSE); + } catch (\ParseError $e) { + \trigger_error($e->getMessage(), \E_USER_NOTICE); + $tokens = []; + } + $namespace = $class = null; + $classLevel = $level = 0; + $res = $uses = []; + $nameTokens = \PHP_VERSION_ID < 80000 ? [\T_STRING, \T_NS_SEPARATOR] : [\T_STRING, \T_NS_SEPARATOR, \T_NAME_QUALIFIED, \T_NAME_FULLY_QUALIFIED]; + while ($token = \current($tokens)) { + \next($tokens); + switch (\is_array($token) ? $token[0] : $token) { + case \T_NAMESPACE: + $namespace = \ltrim(self::fetch($tokens, $nameTokens) . '\\', '\\'); + $uses = []; + break; + case \T_CLASS: + case \T_INTERFACE: + case \T_TRAIT: + case \PHP_VERSION_ID < 80100 ? \T_CLASS : \T_ENUM: + if ($name = self::fetch($tokens, \T_STRING)) { + $class = $namespace . $name; + $classLevel = $level + 1; + $res[$class] = $uses; + if ($class === $forClass) { + return $res; + } + } + break; + case \T_USE: + while (!$class && ($name = self::fetch($tokens, $nameTokens))) { + $name = \ltrim($name, '\\'); + if (self::fetch($tokens, '{')) { + while ($suffix = self::fetch($tokens, $nameTokens)) { + if (self::fetch($tokens, \T_AS)) { + $uses[self::fetch($tokens, \T_STRING)] = $name . $suffix; + } else { + $tmp = \explode('\\', $suffix); + $uses[\end($tmp)] = $name . $suffix; + } + if (!self::fetch($tokens, ',')) { + break; + } + } + } elseif (self::fetch($tokens, \T_AS)) { + $uses[self::fetch($tokens, \T_STRING)] = $name; + } else { + $tmp = \explode('\\', $name); + $uses[\end($tmp)] = $name; + } + if (!self::fetch($tokens, ',')) { + break; + } + } + break; + case \T_CURLY_OPEN: + case \T_DOLLAR_OPEN_CURLY_BRACES: + case '{': + $level++; + break; + case '}': + if ($level === $classLevel) { + $class = $classLevel = 0; + } + $level--; + } + } + return $res; + } + private static function fetch(array &$tokens, $take) : ?string + { + $res = null; + while ($token = \current($tokens)) { + [$token, $s] = \is_array($token) ? $token : [$token, $token]; + if (\in_array($token, (array) $take, \true)) { + $res .= $s; + } elseif (!\in_array($token, [\T_DOC_COMMENT, \T_WHITESPACE, \T_COMMENT], \true)) { + break; + } + \next($tokens); + } + return $res; + } +} diff --git a/vendor/nette/utils/src/Utils/Strings.php b/vendor/nette/utils/src/Utils/Strings.php new file mode 100644 index 00000000..b1229ca3 --- /dev/null +++ b/vendor/nette/utils/src/Utils/Strings.php @@ -0,0 +1,488 @@ += 0xd800 && $code <= 0xdfff || $code > 0x10ffff) { + throw new Nette\InvalidArgumentException('Code point must be in range 0x0 to 0xD7FF or 0xE000 to 0x10FFFF.'); + } elseif (!\extension_loaded('iconv')) { + throw new Nette\NotSupportedException(__METHOD__ . '() requires ICONV extension that is not loaded.'); + } + return \iconv('UTF-32BE', 'UTF-8//IGNORE', \pack('N', $code)); + } + /** + * Starts the $haystack string with the prefix $needle? + */ + public static function startsWith(string $haystack, string $needle) : bool + { + return \strncmp($haystack, $needle, strlen($needle)) === 0; + } + /** + * Ends the $haystack string with the suffix $needle? + */ + public static function endsWith(string $haystack, string $needle) : bool + { + return $needle === '' || \substr($haystack, -strlen($needle)) === $needle; + } + /** + * Does $haystack contain $needle? + */ + public static function contains(string $haystack, string $needle) : bool + { + return \strpos($haystack, $needle) !== \false; + } + /** + * Returns a part of UTF-8 string specified by starting position and length. If start is negative, + * the returned string will start at the start'th character from the end of string. + */ + public static function substring(string $s, int $start, ?int $length = null) : string + { + if (\function_exists('mb_substr')) { + return \mb_substr($s, $start, $length, 'UTF-8'); + // MB is much faster + } elseif (!\extension_loaded('iconv')) { + throw new Nette\NotSupportedException(__METHOD__ . '() requires extension ICONV or MBSTRING, neither is loaded.'); + } elseif ($length === null) { + $length = self::length($s); + } elseif ($start < 0 && $length < 0) { + $start += self::length($s); + // unifies iconv_substr behavior with mb_substr + } + return \iconv_substr($s, $start, $length, 'UTF-8'); + } + /** + * Removes control characters, normalizes line breaks to `\n`, removes leading and trailing blank lines, + * trims end spaces on lines, normalizes UTF-8 to the normal form of NFC. + */ + public static function normalize(string $s) : string + { + // convert to compressed normal form (NFC) + if (\class_exists('Normalizer', \false) && ($n = \Normalizer::normalize($s, \Normalizer::FORM_C)) !== \false) { + $s = $n; + } + $s = self::normalizeNewLines($s); + // remove control characters; leave \t + \n + $s = self::pcre('preg_replace', ['#[\\x00-\\x08\\x0B-\\x1F\\x7F-\\x9F]+#u', '', $s]); + // right trim + $s = self::pcre('preg_replace', ['#[\\t ]+$#m', '', $s]); + // leading and trailing blank lines + $s = \trim($s, "\n"); + return $s; + } + /** + * Standardize line endings to unix-like. + */ + public static function normalizeNewLines(string $s) : string + { + return \str_replace(["\r\n", "\r"], "\n", $s); + } + /** + * Converts UTF-8 string to ASCII, ie removes diacritics etc. + */ + public static function toAscii(string $s) : string + { + $iconv = \defined('ICONV_IMPL') ? \trim(\ICONV_IMPL, '"\'') : null; + static $transliterator = null; + if ($transliterator === null) { + if (\class_exists('Transliterator', \false)) { + $transliterator = \Transliterator::create('Any-Latin; Latin-ASCII'); + } else { + \trigger_error(__METHOD__ . "(): it is recommended to enable PHP extensions 'intl'.", \E_USER_NOTICE); + $transliterator = \false; + } + } + // remove control characters and check UTF-8 validity + $s = self::pcre('preg_replace', ['#[^\\x09\\x0A\\x0D\\x20-\\x7E\\xA0-\\x{2FF}\\x{370}-\\x{10FFFF}]#u', '', $s]); + // transliteration (by Transliterator and iconv) is not optimal, replace some characters directly + $s = \strtr($s, ["„" => '"', "“" => '"', "”" => '"', "‚" => "'", "‘" => "'", "’" => "'", "°" => '^', "Я" => 'Ya', "я" => 'ya', "Ю" => 'Yu', "ю" => 'yu', "Ä" => 'Ae', "Ö" => 'Oe', "Ü" => 'Ue', "ẞ" => 'Ss', "ä" => 'ae', "ö" => 'oe', "ü" => 'ue', "ß" => 'ss']); + // „ “ ” ‚ ‘ ’ ° Я я Ю ю Ä Ö Ü ẞ ä ö ü ß + if ($iconv !== 'libiconv') { + $s = \strtr($s, ["®" => '(R)', "©" => '(c)', "…" => '...', "«" => '<<', "»" => '>>', "£" => 'lb', "¥" => 'yen', "²" => '^2', "³" => '^3', "µ" => 'u', "¹" => '^1', "º" => 'o', "¿" => '?', "ˊ" => "'", "ˍ" => '_', "˝" => '"', "`" => '', "€" => 'EUR', "™" => 'TM', "℮" => 'e', "←" => '<-', "↑" => '^', "→" => '->', "↓" => 'V', "↔" => '<->']); + // ® © … « » £ ¥ ² ³ µ ¹ º ¿ ˊ ˍ ˝ ` € ™ ℮ ← ↑ → ↓ ↔ + } + if ($transliterator) { + $s = $transliterator->transliterate($s); + // use iconv because The transliterator leaves some characters out of ASCII, eg → ʾ + if ($iconv === 'glibc') { + $s = \strtr($s, '?', "\x01"); + // temporarily hide ? to distinguish them from the garbage that iconv creates + $s = \iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s); + $s = \str_replace(['?', "\x01"], ['', '?'], $s); + // remove garbage and restore ? characters + } elseif ($iconv === 'libiconv') { + $s = \iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s); + } else { + // null or 'unknown' (#216) + $s = self::pcre('preg_replace', ['#[^\\x00-\\x7F]++#', '', $s]); + // remove non-ascii chars + } + } elseif ($iconv === 'glibc' || $iconv === 'libiconv') { + // temporarily hide these characters to distinguish them from the garbage that iconv creates + $s = \strtr($s, '`\'"^~?', "\x01\x02\x03\x04\x05\x06"); + if ($iconv === 'glibc') { + // glibc implementation is very limited. transliterate into Windows-1250 and then into ASCII, so most Eastern European characters are preserved + $s = \iconv('UTF-8', 'WINDOWS-1250//TRANSLIT//IGNORE', $s); + $s = \strtr($s, "\xa5\xa3\xbc\x8c\xa7\x8a\xaa\x8d\x8f\x8e\xaf\xb9\xb3\xbe\x9c\x9a\xba\x9d\x9f\x9e\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x96\xa0\x8b\x97\x9b\xa6\xad\xb7", 'ALLSSSSTZZZallssstzzzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTsraaaalccceeeeiiddnnooooruuuuyt- <->|-.'); + $s = self::pcre('preg_replace', ['#[^\\x00-\\x7F]++#', '', $s]); + } else { + $s = \iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s); + } + // remove garbage that iconv creates during transliteration (eg Ý -> Y') + $s = \str_replace(['`', "'", '"', '^', '~', '?'], '', $s); + // restore temporarily hidden characters + $s = \strtr($s, "\x01\x02\x03\x04\x05\x06", '`\'"^~?'); + } else { + $s = self::pcre('preg_replace', ['#[^\\x00-\\x7F]++#', '', $s]); + // remove non-ascii chars + } + return $s; + } + /** + * Modifies the UTF-8 string to the form used in the URL, ie removes diacritics and replaces all characters + * except letters of the English alphabet and numbers with a hyphens. + */ + public static function webalize(string $s, ?string $charlist = null, bool $lower = \true) : string + { + $s = self::toAscii($s); + if ($lower) { + $s = \strtolower($s); + } + $s = self::pcre('preg_replace', ['#[^a-z0-9' . ($charlist !== null ? \preg_quote($charlist, '#') : '') . ']+#i', '-', $s]); + $s = \trim($s, '-'); + return $s; + } + /** + * Truncates a UTF-8 string to given maximal length, while trying not to split whole words. Only if the string is truncated, + * an ellipsis (or something else set with third argument) is appended to the string. + */ + public static function truncate(string $s, int $maxLen, string $append = "…") : string + { + if (self::length($s) > $maxLen) { + $maxLen -= self::length($append); + if ($maxLen < 1) { + return $append; + } elseif ($matches = self::match($s, '#^.{1,' . $maxLen . '}(?=[\\s\\x00-/:-@\\[-`{-~])#us')) { + return $matches[0] . $append; + } else { + return self::substring($s, 0, $maxLen) . $append; + } + } + return $s; + } + /** + * Indents a multiline text from the left. Second argument sets how many indentation chars should be used, + * while the indent itself is the third argument (*tab* by default). + */ + public static function indent(string $s, int $level = 1, string $chars = "\t") : string + { + if ($level > 0) { + $s = self::replace($s, '#(?:^|[\\r\\n]+)(?=[^\\r\\n])#', '$0' . \str_repeat($chars, $level)); + } + return $s; + } + /** + * Converts all characters of UTF-8 string to lower case. + */ + public static function lower(string $s) : string + { + return \mb_strtolower($s, 'UTF-8'); + } + /** + * Converts the first character of a UTF-8 string to lower case and leaves the other characters unchanged. + */ + public static function firstLower(string $s) : string + { + return self::lower(self::substring($s, 0, 1)) . self::substring($s, 1); + } + /** + * Converts all characters of a UTF-8 string to upper case. + */ + public static function upper(string $s) : string + { + return \mb_strtoupper($s, 'UTF-8'); + } + /** + * Converts the first character of a UTF-8 string to upper case and leaves the other characters unchanged. + */ + public static function firstUpper(string $s) : string + { + return self::upper(self::substring($s, 0, 1)) . self::substring($s, 1); + } + /** + * Converts the first character of every word of a UTF-8 string to upper case and the others to lower case. + */ + public static function capitalize(string $s) : string + { + return \mb_convert_case($s, \MB_CASE_TITLE, 'UTF-8'); + } + /** + * Compares two UTF-8 strings or their parts, without taking character case into account. If length is null, whole strings are compared, + * if it is negative, the corresponding number of characters from the end of the strings is compared, + * otherwise the appropriate number of characters from the beginning is compared. + */ + public static function compare(string $left, string $right, ?int $length = null) : bool + { + if (\class_exists('Normalizer', \false)) { + $left = \Normalizer::normalize($left, \Normalizer::FORM_D); + // form NFD is faster + $right = \Normalizer::normalize($right, \Normalizer::FORM_D); + // form NFD is faster + } + if ($length < 0) { + $left = self::substring($left, $length, -$length); + $right = self::substring($right, $length, -$length); + } elseif ($length !== null) { + $left = self::substring($left, 0, $length); + $right = self::substring($right, 0, $length); + } + return self::lower($left) === self::lower($right); + } + /** + * Finds the common prefix of strings or returns empty string if the prefix was not found. + * @param string[] $strings + */ + public static function findPrefix(array $strings) : string + { + $first = \array_shift($strings); + for ($i = 0; $i < strlen($first); $i++) { + foreach ($strings as $s) { + if (!isset($s[$i]) || $first[$i] !== $s[$i]) { + while ($i && $first[$i - 1] >= "\x80" && $first[$i] >= "\x80" && $first[$i] < "\xc0") { + $i--; + } + return \substr($first, 0, $i); + } + } + } + return $first; + } + /** + * Returns number of characters (not bytes) in UTF-8 string. + * That is the number of Unicode code points which may differ from the number of graphemes. + */ + public static function length(string $s) : int + { + return \function_exists('mb_strlen') ? \mb_strlen($s, 'UTF-8') : strlen(\utf8_decode($s)); + } + /** + * Removes all left and right side spaces (or the characters passed as second argument) from a UTF-8 encoded string. + */ + public static function trim(string $s, string $charlist = self::TRIM_CHARACTERS) : string + { + $charlist = \preg_quote($charlist, '#'); + return self::replace($s, '#^[' . $charlist . ']+|[' . $charlist . ']+$#Du', ''); + } + /** + * Pads a UTF-8 string to given length by prepending the $pad string to the beginning. + * @param non-empty-string $pad + */ + public static function padLeft(string $s, int $length, string $pad = ' ') : string + { + $length = \max(0, $length - self::length($s)); + $padLen = self::length($pad); + return \str_repeat($pad, (int) ($length / $padLen)) . self::substring($pad, 0, $length % $padLen) . $s; + } + /** + * Pads UTF-8 string to given length by appending the $pad string to the end. + * @param non-empty-string $pad + */ + public static function padRight(string $s, int $length, string $pad = ' ') : string + { + $length = \max(0, $length - self::length($s)); + $padLen = self::length($pad); + return $s . \str_repeat($pad, (int) ($length / $padLen)) . self::substring($pad, 0, $length % $padLen); + } + /** + * Reverses UTF-8 string. + */ + public static function reverse(string $s) : string + { + if (!\extension_loaded('iconv')) { + throw new Nette\NotSupportedException(__METHOD__ . '() requires ICONV extension that is not loaded.'); + } + return \iconv('UTF-32LE', 'UTF-8', \strrev(\iconv('UTF-8', 'UTF-32BE', $s))); + } + /** + * Returns part of $haystack before $nth occurence of $needle or returns null if the needle was not found. + * Negative value means searching from the end. + */ + public static function before(string $haystack, string $needle, int $nth = 1) : ?string + { + $pos = self::pos($haystack, $needle, $nth); + return $pos === null ? null : \substr($haystack, 0, $pos); + } + /** + * Returns part of $haystack after $nth occurence of $needle or returns null if the needle was not found. + * Negative value means searching from the end. + */ + public static function after(string $haystack, string $needle, int $nth = 1) : ?string + { + $pos = self::pos($haystack, $needle, $nth); + return $pos === null ? null : \substr($haystack, $pos + strlen($needle)); + } + /** + * Returns position in characters of $nth occurence of $needle in $haystack or null if the $needle was not found. + * Negative value of `$nth` means searching from the end. + */ + public static function indexOf(string $haystack, string $needle, int $nth = 1) : ?int + { + $pos = self::pos($haystack, $needle, $nth); + return $pos === null ? null : self::length(\substr($haystack, 0, $pos)); + } + /** + * Returns position in characters of $nth occurence of $needle in $haystack or null if the needle was not found. + */ + private static function pos(string $haystack, string $needle, int $nth = 1) : ?int + { + if (!$nth) { + return null; + } elseif ($nth > 0) { + if ($needle === '') { + return 0; + } + $pos = 0; + while (($pos = \strpos($haystack, $needle, $pos)) !== \false && --$nth) { + $pos++; + } + } else { + $len = strlen($haystack); + if ($needle === '') { + return $len; + } elseif ($len === 0) { + return null; + } + $pos = $len - 1; + while (($pos = \strrpos($haystack, $needle, $pos - $len)) !== \false && ++$nth) { + $pos--; + } + } + return Helpers::falseToNull($pos); + } + /** + * Splits a string into array by the regular expression. Parenthesized expression in the delimiter are captured. + * Parameter $flags can be any combination of PREG_SPLIT_NO_EMPTY and PREG_OFFSET_CAPTURE flags. + */ + public static function split( + string $subject, + /** + * @language + */ + string $pattern, + int $flags = 0 + ) : array + { + return self::pcre('preg_split', [$pattern, $subject, -1, $flags | \PREG_SPLIT_DELIM_CAPTURE]); + } + /** + * Checks if given string matches a regular expression pattern and returns an array with first found match and each subpattern. + * Parameter $flags can be any combination of PREG_OFFSET_CAPTURE and PREG_UNMATCHED_AS_NULL flags. + */ + public static function match( + string $subject, + /** + * @language + */ + string $pattern, + int $flags = 0, + int $offset = 0 + ) : ?array + { + if ($offset > strlen($subject)) { + return null; + } + return self::pcre('preg_match', [$pattern, $subject, &$m, $flags, $offset]) ? $m : null; + } + /** + * Finds all occurrences matching regular expression pattern and returns a two-dimensional array. Result is array of matches (ie uses by default PREG_SET_ORDER). + * Parameter $flags can be any combination of PREG_OFFSET_CAPTURE, PREG_UNMATCHED_AS_NULL and PREG_PATTERN_ORDER flags. + */ + public static function matchAll( + string $subject, + /** + * @language + */ + string $pattern, + int $flags = 0, + int $offset = 0 + ) : array + { + if ($offset > strlen($subject)) { + return []; + } + self::pcre('preg_match_all', [$pattern, $subject, &$m, $flags & \PREG_PATTERN_ORDER ? $flags : $flags | \PREG_SET_ORDER, $offset]); + return $m; + } + /** + * Replaces all occurrences matching regular expression $pattern which can be string or array in the form `pattern => replacement`. + * @param string|array $pattern + * @param string|callable $replacement + */ + public static function replace( + string $subject, + /** + * @language + */ + $pattern, + $replacement = '', + int $limit = -1 + ) : string + { + if (is_object($replacement) || is_array($replacement)) { + if (!\is_callable($replacement, \false, $textual)) { + throw new Nette\InvalidStateException("Callback '{$textual}' is not callable."); + } + return self::pcre('preg_replace_callback', [$pattern, $replacement, $subject, $limit]); + } elseif (is_array($pattern) && \is_string(\key($pattern))) { + $replacement = \array_values($pattern); + $pattern = \array_keys($pattern); + } + return self::pcre('preg_replace', [$pattern, $replacement, $subject, $limit]); + } + /** @internal */ + public static function pcre(string $func, array $args) + { + $res = Callback::invokeSafe($func, $args, function (string $message) use($args) : void { + // compile-time error, not detectable by preg_last_error + throw new RegexpException($message . ' in pattern: ' . \implode(' or ', (array) $args[0])); + }); + if (($code = \preg_last_error()) && ($res === null || !\in_array($func, ['preg_filter', 'preg_replace_callback', 'preg_replace'], \true))) { + throw new RegexpException((RegexpException::MESSAGES[$code] ?? 'Unknown error') . ' (pattern: ' . \implode(' or ', (array) $args[0]) . ')', $code); + } + return $res; + } +} diff --git a/vendor/nette/utils/src/Utils/Type.php b/vendor/nette/utils/src/Utils/Type.php new file mode 100644 index 00000000..d2b11e03 --- /dev/null +++ b/vendor/nette/utils/src/Utils/Type.php @@ -0,0 +1,212 @@ + */ + private $types; + /** @var bool */ + private $simple; + /** @var string |, & */ + private $kind; + /** + * Creates a Type object based on reflection. Resolves self, static and parent to the actual class name. + * If the subject has no type, it returns null. + * @param \ReflectionFunctionAbstract|\ReflectionParameter|\ReflectionProperty $reflection + */ + public static function fromReflection($reflection) : ?self + { + if ($reflection instanceof \ReflectionProperty && \PHP_VERSION_ID < 70400) { + return null; + } elseif ($reflection instanceof \ReflectionMethod) { + $type = $reflection->getReturnType() ?? (\PHP_VERSION_ID >= 80100 ? $reflection->getTentativeReturnType() : null); + } else { + $type = $reflection instanceof \ReflectionFunctionAbstract ? $reflection->getReturnType() : $reflection->getType(); + } + return $type ? self::fromReflectionType($type, $reflection, \true) : null; + } + private static function fromReflectionType(\ReflectionType $type, $of, bool $asObject) + { + if ($type instanceof \ReflectionNamedType) { + $name = self::resolve($type->getName(), $of); + return $asObject ? new self($type->allowsNull() && $name !== 'mixed' ? [$name, 'null'] : [$name]) : $name; + } elseif ($type instanceof \ReflectionUnionType || $type instanceof \ReflectionIntersectionType) { + return new self(\array_map(function ($t) use($of) { + return self::fromReflectionType($t, $of, \false); + }, $type->getTypes()), $type instanceof \ReflectionUnionType ? '|' : '&'); + } else { + throw new Nette\InvalidStateException('Unexpected type of ' . Reflection::toString($of)); + } + } + /** + * Creates the Type object according to the text notation. + */ + public static function fromString(string $type) : self + { + if (!Validators::isTypeDeclaration($type)) { + throw new Nette\InvalidArgumentException("Invalid type '{$type}'."); + } + if ($type[0] === '?') { + return new self([\substr($type, 1), 'null']); + } + $unions = []; + foreach (\explode('|', $type) as $part) { + $part = \explode('&', \trim($part, '()')); + $unions[] = \count($part) === 1 ? $part[0] : new self($part, '&'); + } + return \count($unions) === 1 && $unions[0] instanceof self ? $unions[0] : new self($unions); + } + /** + * Resolves 'self', 'static' and 'parent' to the actual class name. + * @param \ReflectionFunctionAbstract|\ReflectionParameter|\ReflectionProperty $of + */ + public static function resolve(string $type, $of) : string + { + $lower = \strtolower($type); + if ($of instanceof \ReflectionFunction) { + return $type; + } elseif ($lower === 'self' || $lower === 'static') { + return $of->getDeclaringClass()->name; + } elseif ($lower === 'parent' && $of->getDeclaringClass()->getParentClass()) { + return $of->getDeclaringClass()->getParentClass()->name; + } else { + return $type; + } + } + private function __construct(array $types, string $kind = '|') + { + $o = \array_search('null', $types, \true); + if ($o !== \false) { + // null as last + \array_splice($types, $o, 1); + $types[] = 'null'; + } + $this->types = $types; + $this->simple = \is_string($types[0]) && ($types[1] ?? 'null') === 'null'; + $this->kind = \count($types) > 1 ? $kind : ''; + } + public function __toString() : string + { + $multi = \count($this->types) > 1; + if ($this->simple) { + return ($multi ? '?' : '') . $this->types[0]; + } + $res = []; + foreach ($this->types as $type) { + $res[] = $type instanceof self && $multi ? "({$type})" : $type; + } + return \implode($this->kind, $res); + } + /** + * Returns the array of subtypes that make up the compound type as strings. + * @return array + */ + public function getNames() : array + { + return \array_map(function ($t) { + return $t instanceof self ? $t->getNames() : $t; + }, $this->types); + } + /** + * Returns the array of subtypes that make up the compound type as Type objects: + * @return self[] + */ + public function getTypes() : array + { + return \array_map(function ($t) { + return $t instanceof self ? $t : new self([$t]); + }, $this->types); + } + /** + * Returns the type name for simple types, otherwise null. + */ + public function getSingleName() : ?string + { + return $this->simple ? $this->types[0] : null; + } + /** + * Returns true whether it is a union type. + */ + public function isUnion() : bool + { + return $this->kind === '|'; + } + /** + * Returns true whether it is an intersection type. + */ + public function isIntersection() : bool + { + return $this->kind === '&'; + } + /** + * Returns true whether it is a simple type. Single nullable types are also considered to be simple types. + */ + public function isSimple() : bool + { + return $this->simple; + } + /** @deprecated use isSimple() */ + public function isSingle() : bool + { + return $this->simple; + } + /** + * Returns true whether the type is both a simple and a PHP built-in type. + */ + public function isBuiltin() : bool + { + return $this->simple && Validators::isBuiltinType($this->types[0]); + } + /** + * Returns true whether the type is both a simple and a class name. + */ + public function isClass() : bool + { + return $this->simple && !Validators::isBuiltinType($this->types[0]); + } + /** + * Determines if type is special class name self/parent/static. + */ + public function isClassKeyword() : bool + { + return $this->simple && Validators::isClassKeyword($this->types[0]); + } + /** + * Verifies type compatibility. For example, it checks if a value of a certain type could be passed as a parameter. + */ + public function allows(string $subtype) : bool + { + if ($this->types === ['mixed']) { + return \true; + } + $subtype = self::fromString($subtype); + return $subtype->isUnion() ? Arrays::every($subtype->types, function ($t) { + return $this->allows2($t instanceof self ? $t->types : [$t]); + }) : $this->allows2($subtype->types); + } + private function allows2(array $subtypes) : bool + { + return $this->isUnion() ? Arrays::some($this->types, function ($t) use($subtypes) { + return $this->allows3($t instanceof self ? $t->types : [$t], $subtypes); + }) : $this->allows3($this->types, $subtypes); + } + private function allows3(array $types, array $subtypes) : bool + { + return Arrays::every($types, function ($type) use($subtypes) { + $builtin = Validators::isBuiltinType($type); + return Arrays::some($subtypes, function ($subtype) use($type, $builtin) { + return $builtin ? \strcasecmp($type, $subtype) === 0 : \is_a($subtype, $type, \true); + }); + }); + } +} diff --git a/vendor/nette/utils/src/Utils/Validators.php b/vendor/nette/utils/src/Utils/Validators.php new file mode 100644 index 00000000..374a2324 --- /dev/null +++ b/vendor/nette/utils/src/Utils/Validators.php @@ -0,0 +1,341 @@ + 1, 'int' => 1, 'float' => 1, 'bool' => 1, 'array' => 1, 'object' => 1, 'callable' => 1, 'iterable' => 1, 'void' => 1, 'null' => 1, 'mixed' => 1, 'false' => 1, 'never' => 1, 'true' => 1]; + /** @var array */ + protected static $validators = [ + // PHP types + 'array' => 'is_array', + 'bool' => 'is_bool', + 'boolean' => 'is_bool', + 'float' => 'is_float', + 'int' => 'is_int', + 'integer' => 'is_int', + 'null' => 'is_null', + 'object' => 'is_object', + 'resource' => 'is_resource', + 'scalar' => 'is_scalar', + 'string' => 'is_string', + // pseudo-types + 'callable' => [self::class, 'isCallable'], + 'iterable' => 'is_iterable', + 'list' => [Arrays::class, 'isList'], + 'mixed' => [self::class, 'isMixed'], + 'none' => [self::class, 'isNone'], + 'number' => [self::class, 'isNumber'], + 'numeric' => [self::class, 'isNumeric'], + 'numericint' => [self::class, 'isNumericInt'], + // string patterns + 'alnum' => 'ctype_alnum', + 'alpha' => 'ctype_alpha', + 'digit' => 'ctype_digit', + 'lower' => 'ctype_lower', + 'pattern' => null, + 'space' => 'ctype_space', + 'unicode' => [self::class, 'isUnicode'], + 'upper' => 'ctype_upper', + 'xdigit' => 'ctype_xdigit', + // syntax validation + 'email' => [self::class, 'isEmail'], + 'identifier' => [self::class, 'isPhpIdentifier'], + 'uri' => [self::class, 'isUri'], + 'url' => [self::class, 'isUrl'], + // environment validation + 'class' => 'class_exists', + 'interface' => 'interface_exists', + 'directory' => 'is_dir', + 'file' => 'is_file', + 'type' => [self::class, 'isType'], + ]; + /** @var array */ + protected static $counters = ['string' => 'strlen', 'unicode' => [Strings::class, 'length'], 'array' => 'count', 'list' => 'count', 'alnum' => 'strlen', 'alpha' => 'strlen', 'digit' => 'strlen', 'lower' => 'strlen', 'space' => 'strlen', 'upper' => 'strlen', 'xdigit' => 'strlen']; + /** + * Verifies that the value is of expected types separated by pipe. + * @param mixed $value + * @throws AssertionException + */ + public static function assert($value, string $expected, string $label = 'variable') : void + { + if (!static::is($value, $expected)) { + $expected = \str_replace(['|', ':'], [' or ', ' in range '], $expected); + $translate = ['boolean' => 'bool', 'integer' => 'int', 'double' => 'float', 'NULL' => 'null']; + $type = $translate[\gettype($value)] ?? \gettype($value); + if (\is_int($value) || \is_float($value) || \is_string($value) && \strlen($value) < 40) { + $type .= ' ' . \var_export($value, \true); + } elseif (\is_object($value)) { + $type .= ' ' . \get_class($value); + } + throw new AssertionException("The {$label} expects to be {$expected}, {$type} given."); + } + } + /** + * Verifies that element $key in array is of expected types separated by pipe. + * @param mixed[] $array + * @param int|string $key + * @throws AssertionException + */ + public static function assertField(array $array, $key, ?string $expected = null, string $label = "item '%' in array") : void + { + if (!\array_key_exists($key, $array)) { + throw new AssertionException('Missing ' . \str_replace('%', $key, $label) . '.'); + } elseif ($expected) { + static::assert($array[$key], $expected, \str_replace('%', $key, $label)); + } + } + /** + * Verifies that the value is of expected types separated by pipe. + * @param mixed $value + */ + public static function is($value, string $expected) : bool + { + foreach (\explode('|', $expected) as $item) { + if (\substr($item, -2) === '[]') { + if (\is_iterable($value) && self::everyIs($value, \substr($item, 0, -2))) { + return \true; + } + continue; + } elseif (\substr($item, 0, 1) === '?') { + $item = \substr($item, 1); + if ($value === null) { + return \true; + } + } + [$type] = $item = \explode(':', $item, 2); + if (isset(static::$validators[$type])) { + try { + if (!static::$validators[$type]($value)) { + continue; + } + } catch (\TypeError $e) { + continue; + } + } elseif ($type === 'pattern') { + if (Strings::match($value, '|^' . ($item[1] ?? '') . '$|D')) { + return \true; + } + continue; + } elseif (!$value instanceof $type) { + continue; + } + if (isset($item[1])) { + $length = $value; + if (isset(static::$counters[$type])) { + $length = static::$counters[$type]($value); + } + $range = \explode('..', $item[1]); + if (!isset($range[1])) { + $range[1] = $range[0]; + } + if ($range[0] !== '' && $length < $range[0] || $range[1] !== '' && $length > $range[1]) { + continue; + } + } + return \true; + } + return \false; + } + /** + * Finds whether all values are of expected types separated by pipe. + * @param mixed[] $values + */ + public static function everyIs(iterable $values, string $expected) : bool + { + foreach ($values as $value) { + if (!static::is($value, $expected)) { + return \false; + } + } + return \true; + } + /** + * Checks if the value is an integer or a float. + * @param mixed $value + */ + public static function isNumber($value) : bool + { + return \is_int($value) || \is_float($value); + } + /** + * Checks if the value is an integer or a integer written in a string. + * @param mixed $value + */ + public static function isNumericInt($value) : bool + { + return \is_int($value) || \is_string($value) && \preg_match('#^[+-]?[0-9]+$#D', $value); + } + /** + * Checks if the value is a number or a number written in a string. + * @param mixed $value + */ + public static function isNumeric($value) : bool + { + return \is_float($value) || \is_int($value) || \is_string($value) && \preg_match('#^[+-]?([0-9]++\\.?[0-9]*|\\.[0-9]+)$#D', $value); + } + /** + * Checks if the value is a syntactically correct callback. + * @param mixed $value + */ + public static function isCallable($value) : bool + { + return $value && \is_callable($value, \true); + } + /** + * Checks if the value is a valid UTF-8 string. + * @param mixed $value + */ + public static function isUnicode($value) : bool + { + return \is_string($value) && \preg_match('##u', $value); + } + /** + * Checks if the value is 0, '', false or null. + * @param mixed $value + */ + public static function isNone($value) : bool + { + return $value == null; + // intentionally == + } + /** @internal */ + public static function isMixed() : bool + { + return \true; + } + /** + * Checks if a variable is a zero-based integer indexed array. + * @param mixed $value + * @deprecated use Nette\Utils\Arrays::isList + * @return ($value is list ? true : false) + */ + public static function isList($value) : bool + { + return Arrays::isList($value); + } + /** + * Checks if the value is in the given range [min, max], where the upper or lower limit can be omitted (null). + * Numbers, strings and DateTime objects can be compared. + * @param mixed $value + */ + public static function isInRange($value, array $range) : bool + { + if ($value === null || !(isset($range[0]) || isset($range[1]))) { + return \false; + } + $limit = $range[0] ?? $range[1]; + if (\is_string($limit)) { + $value = (string) $value; + } elseif ($limit instanceof \DateTimeInterface) { + if (!$value instanceof \DateTimeInterface) { + return \false; + } + } elseif (\is_numeric($value)) { + $value *= 1; + } else { + return \false; + } + return (!isset($range[0]) || $value >= $range[0]) && (!isset($range[1]) || $value <= $range[1]); + } + /** + * Checks if the value is a valid email address. It does not verify that the domain actually exists, only the syntax is verified. + */ + public static function isEmail(string $value) : bool + { + $atom = "[-a-z0-9!#\$%&'*+/=?^_`{|}~]"; + // RFC 5322 unquoted characters in local-part + $alpha = "a-z\x80-\xff"; + // superset of IDN + return (bool) \preg_match(<< \\? (? [a-zA-Z_\x7f-\xff][\w\x7f-\xff]*) (\\ (?&name))* ) | + (? (?&type) (& (?&type))+ ) | + (? (?&type) | \( (?&intersection) \) ) (\| (?&upart))+ + )$~xAD +XX +, $type); + } +} diff --git a/vendor/nette/utils/src/Utils/exceptions.php b/vendor/nette/utils/src/Utils/exceptions.php new file mode 100644 index 00000000..ddc7dd24 --- /dev/null +++ b/vendor/nette/utils/src/Utils/exceptions.php @@ -0,0 +1,40 @@ + 'Internal error', \PREG_BACKTRACK_LIMIT_ERROR => 'Backtrack limit was exhausted', \PREG_RECURSION_LIMIT_ERROR => 'Recursion limit was exhausted', \PREG_BAD_UTF8_ERROR => 'Malformed UTF-8 data', \PREG_BAD_UTF8_OFFSET_ERROR => 'Offset didn\'t correspond to the begin of a valid UTF-8 code point', 6 => 'Failed due to limited JIT stack space']; +} +/** + * The exception that indicates assertion error. + */ +class AssertionException extends \Exception +{ +} diff --git a/vendor/nette/utils/src/compatibility.php b/vendor/nette/utils/src/compatibility.php new file mode 100644 index 00000000..d43a3e9a --- /dev/null +++ b/vendor/nette/utils/src/compatibility.php @@ -0,0 +1,28 @@ +=7.4.0" + }, + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Psr\\Container\\": "src\/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + } +} \ No newline at end of file diff --git a/vendor/psr/container/src/ContainerExceptionInterface.php b/vendor/psr/container/src/ContainerExceptionInterface.php new file mode 100644 index 00000000..4cc2feb1 --- /dev/null +++ b/vendor/psr/container/src/ContainerExceptionInterface.php @@ -0,0 +1,11 @@ + 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/psr/simple-cache/README.md b/vendor/psr/simple-cache/README.md new file mode 100644 index 00000000..43641d17 --- /dev/null +++ b/vendor/psr/simple-cache/README.md @@ -0,0 +1,8 @@ +PHP FIG Simple Cache PSR +======================== + +This repository holds all interfaces related to PSR-16. + +Note that this is not a cache implementation of its own. It is merely an interface that describes a cache implementation. See [the specification](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-16-simple-cache.md) for more details. + +You can find implementations of the specification by looking for packages providing the [psr/simple-cache-implementation](https://packagist.org/providers/psr/simple-cache-implementation) virtual package. diff --git a/vendor/psr/simple-cache/composer.json b/vendor/psr/simple-cache/composer.json new file mode 100644 index 00000000..e89d651c --- /dev/null +++ b/vendor/psr/simple-cache/composer.json @@ -0,0 +1,31 @@ +{ + "name": "psr\/simple-cache", + "description": "Common interfaces for simple caching", + "keywords": [ + "psr", + "psr-16", + "cache", + "simple-cache", + "caching" + ], + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https:\/\/www.php-fig.org\/" + } + ], + "require": { + "php": ">=8.0.0" + }, + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Psr\\SimpleCache\\": "src\/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + } +} \ No newline at end of file diff --git a/vendor/psr/simple-cache/src/CacheException.php b/vendor/psr/simple-cache/src/CacheException.php new file mode 100644 index 00000000..0cbd683a --- /dev/null +++ b/vendor/psr/simple-cache/src/CacheException.php @@ -0,0 +1,10 @@ + $keys A list of keys that can be obtained in a single operation. + * @param mixed $default Default value to return for keys that do not exist. + * + * @return iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $keys is neither an array nor a Traversable, + * or if any of the $keys are not a legal value. + */ + public function getMultiple(iterable $keys, $default = null) : iterable; + /** + * Persists a set of key => value pairs in the cache, with an optional TTL. + * + * @param iterable $values A list of key => value pairs for a multiple-set operation. + * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and + * the driver supports TTL then the library may set a default value + * for it or let the driver take care of that. + * + * @return bool True on success and false on failure. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $values is neither an array nor a Traversable, + * or if any of the $values are not a legal value. + */ + public function setMultiple(iterable $values, $ttl = null) : bool; + /** + * Deletes multiple cache items in a single operation. + * + * @param iterable $keys A list of string-based keys to be deleted. + * + * @return bool True if the items were successfully removed. False if there was an error. + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if $keys is neither an array nor a Traversable, + * or if any of the $keys are not a legal value. + */ + public function deleteMultiple(iterable $keys) : bool; + /** + * Determines whether an item is present in the cache. + * + * NOTE: It is recommended that has() is only to be used for cache warming type purposes + * and not to be used within your live applications operations for get/set, as this method + * is subject to a race condition where your has() will return true and immediately after, + * another script can remove it making the state of your app out of date. + * + * @param string $key The cache item key. + * + * @return bool + * + * @throws \Psr\SimpleCache\InvalidArgumentException + * MUST be thrown if the $key string is not a legal value. + */ + public function has(string $key) : bool; +} diff --git a/vendor/psr/simple-cache/src/InvalidArgumentException.php b/vendor/psr/simple-cache/src/InvalidArgumentException.php new file mode 100644 index 00000000..585fd163 --- /dev/null +++ b/vendor/psr/simple-cache/src/InvalidArgumentException.php @@ -0,0 +1,13 @@ +=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 + +[6.0.1]: https://github.com/sebastianbergmann/diff/compare/6.0.0...6.0.1 +[6.0.0]: https://github.com/sebastianbergmann/diff/compare/5.1...6.0.0 +[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 new file mode 100644 index 00000000..5b4705a4 --- /dev/null +++ b/vendor/sebastian/diff/LICENSE @@ -0,0 +1,29 @@ +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 new file mode 100644 index 00000000..539dc59e --- /dev/null +++ b/vendor/sebastian/diff/README.md @@ -0,0 +1,206 @@ +[![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 new file mode 100644 index 00000000..d88ff001 --- /dev/null +++ b/vendor/sebastian/diff/SECURITY.md @@ -0,0 +1,30 @@ +# 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 new file mode 100644 index 00000000..84a36d7e --- /dev/null +++ b/vendor/sebastian/diff/composer.json @@ -0,0 +1,56 @@ +{ + "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.2.0" + }, + "optimize-autoloader": true, + "sort-packages": true + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit\/phpunit": "^11.0", + "symfony\/process": "^4.2 || ^5" + }, + "autoload": { + "classmap": [ + "src\/" + ] + }, + "autoload-dev": { + "classmap": [ + "tests\/" + ] + }, + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + } +} \ No newline at end of file diff --git a/vendor/sebastian/diff/src/Chunk.php b/vendor/sebastian/diff/src/Chunk.php new file mode 100644 index 00000000..2edd0faf --- /dev/null +++ b/vendor/sebastian/diff/src/Chunk.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\SebastianBergmann\Diff; + +use ArrayIterator; +use IteratorAggregate; +use Traversable; +/** + * @template-implements IteratorAggregate + */ +final class Chunk implements IteratorAggregate +{ + /** + * @var int + */ + private $start; + /** + * @var int + */ + private $startRange; + /** + * @var int + */ + private $end; + /** + * @var int + */ + private $endRange; + /** + * @var mixed[] + */ + private $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; + } + 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 new file mode 100644 index 00000000..8ab31e5e --- /dev/null +++ b/vendor/sebastian/diff/src/Diff.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\SebastianBergmann\Diff; + +use ArrayIterator; +use IteratorAggregate; +use Traversable; +/** + * @template-implements IteratorAggregate + */ +final class Diff implements IteratorAggregate +{ + /** + * @psalm-var non-empty-string + * @var string + */ + private $from; + /** + * @psalm-var non-empty-string + * @var string + */ + private $to; + /** + * @psalm-var list + * @var mixed[] + */ + private $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; + } + 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 new file mode 100644 index 00000000..fea30870 --- /dev/null +++ b/vendor/sebastian/diff/src/Differ.php @@ -0,0 +1,206 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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 RuleDocGenerator202403\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; + /** + * @var \SebastianBergmann\Diff\Output\DiffOutputBuilderInterface + */ + private $outputBuilder; + public function __construct(DiffOutputBuilderInterface $outputBuilder) + { + $this->outputBuilder = $outputBuilder; + } + /** + * @param mixed[]|string $from + * @param mixed[]|string $to + */ + public function diff($from, $to, ?LongestCommonSubsequenceCalculator $lcs = null) : string + { + $diff = $this->diffToArray($from, $to, $lcs); + return $this->outputBuilder->getDiff($diff); + } + /** + * @param mixed[]|string $from + * @param mixed[]|string $to + */ + public function diffToArray($from, $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(); + } + /** + * @return float|int + */ + private function calculateEstimatedFootprint(array $from, array $to) + { + $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 (\substr_compare($line, "\r\n", -\strlen("\r\n")) === 0) { + 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 new file mode 100644 index 00000000..eeca08e2 --- /dev/null +++ b/vendor/sebastian/diff/src/Exception/ConfigurationException.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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) ? \get_class($value) : (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 new file mode 100644 index 00000000..ef9112de --- /dev/null +++ b/vendor/sebastian/diff/src/Exception/Exception.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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 new file mode 100644 index 00000000..fd89f6bf --- /dev/null +++ b/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php @@ -0,0 +1,16 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\SebastianBergmann\Diff; + +class InvalidArgumentException extends \InvalidArgumentException implements Exception +{ +} diff --git a/vendor/sebastian/diff/src/Line.php b/vendor/sebastian/diff/src/Line.php new file mode 100644 index 00000000..6f725ff1 --- /dev/null +++ b/vendor/sebastian/diff/src/Line.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\SebastianBergmann\Diff; + +final class Line +{ + public const ADDED = 1; + public const REMOVED = 2; + public const UNCHANGED = 3; + /** + * @var int + */ + private $type; + /** + * @var string + */ + private $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; + } +} diff --git a/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php new file mode 100644 index 00000000..7ec58e92 --- /dev/null +++ b/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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 new file mode 100644 index 00000000..4ade2765 --- /dev/null +++ b/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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 new file mode 100644 index 00000000..70755cad --- /dev/null +++ b/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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) { + 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 new file mode 100644 index 00000000..762d0a64 --- /dev/null +++ b/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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 RuleDocGenerator202403\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 +{ + /** + * @var string + */ + private $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 (\substr_compare($this->header, "\n", -\strlen("\n")) !== 0) { + 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 new file mode 100644 index 00000000..674785c9 --- /dev/null +++ b/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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 new file mode 100644 index 00000000..86686e83 --- /dev/null +++ b/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php @@ -0,0 +1,252 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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 RuleDocGenerator202403\SebastianBergmann\Diff\ConfigurationException; +use RuleDocGenerator202403\SebastianBergmann\Diff\Differ; +/** + * Strict Unified diff output builder. + * + * Generates (strict) Unified diff's (unidiffs) with hunks. + */ +final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface +{ + /** + * @var mixed[] + */ + private static $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, + ]; + /** + * @var bool + */ + private $changed; + /** + * @var bool + */ + private $collapseRanges; + /** + * @psalm-var positive-int + * @var int + */ + private $commonLineThreshold; + /** + * @var string + */ + private $header; + /** + * @psalm-var positive-int + * @var int + */ + private $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 new file mode 100644 index 00000000..6f699deb --- /dev/null +++ b/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php @@ -0,0 +1,197 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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 RuleDocGenerator202403\SebastianBergmann\Diff\Differ; +/** + * Builds a diff string representation in unified diff format in chunks. + */ +final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder +{ + /** + * @var bool + */ + private $collapseRanges = \true; + /** + * @var int + */ + private $commonLineThreshold = 6; + /** + * @psalm-var positive-int + * @var int + */ + private $contextLines = 3; + /** + * @var string + */ + private $header; + /** + * @var bool + */ + private $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 (\substr_compare($this->header, "\n", -\strlen("\n")) !== 0) { + 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 new file mode 100644 index 00000000..abb1d9da --- /dev/null +++ b/vendor/sebastian/diff/src/Parser.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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']); + ($nullsafeVariable1 = $chunk) ? $nullsafeVariable1->setLines($diffLines) : null; + } + } + $diff->setChunks($chunks); + } +} diff --git a/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php b/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php new file mode 100644 index 00000000..1f7b4bee --- /dev/null +++ b/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\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/symfony/console/Application.php b/vendor/symfony/console/Application.php new file mode 100644 index 00000000..bce1acb0 --- /dev/null +++ b/vendor/symfony/console/Application.php @@ -0,0 +1,1163 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Command\CompleteCommand; +use RuleDocGenerator202403\Symfony\Component\Console\Command\DumpCompletionCommand; +use RuleDocGenerator202403\Symfony\Component\Console\Command\HelpCommand; +use RuleDocGenerator202403\Symfony\Component\Console\Command\LazyCommand; +use RuleDocGenerator202403\Symfony\Component\Console\Command\ListCommand; +use RuleDocGenerator202403\Symfony\Component\Console\Command\SignalableCommandInterface; +use RuleDocGenerator202403\Symfony\Component\Console\CommandLoader\CommandLoaderInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionInput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\Suggestion; +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleCommandEvent; +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleErrorEvent; +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleSignalEvent; +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleTerminateEvent; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\CommandNotFoundException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\ExceptionInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\LogicException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\NamespaceNotFoundException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RuntimeException; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatter; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\DebugFormatterHelper; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\DescriptorHelper; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\FormatterHelper; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\Helper; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\HelperSet; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\ProcessHelper; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\QuestionHelper; +use RuleDocGenerator202403\Symfony\Component\Console\Input\ArgvInput; +use RuleDocGenerator202403\Symfony\Component\Console\Input\ArrayInput; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputAwareInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\SignalRegistry\SignalRegistry; +use RuleDocGenerator202403\Symfony\Component\Console\Style\SymfonyStyle; +use RuleDocGenerator202403\Symfony\Component\ErrorHandler\ErrorHandler; +use RuleDocGenerator202403\Symfony\Contracts\EventDispatcher\EventDispatcherInterface; +use RuleDocGenerator202403\Symfony\Contracts\Service\ResetInterface; +/** + * An Application is the container for a collection of commands. + * + * It is the main entry point of a Console application. + * + * This class is optimized for a standard CLI environment. + * + * Usage: + * + * $app = new Application('myapp', '1.0 (stable)'); + * $app->add(new SimpleCommand()); + * $app->run(); + * + * @author Fabien Potencier + */ +class Application implements ResetInterface +{ + /** + * @var mixed[] + */ + private $commands = []; + /** + * @var bool + */ + private $wantHelps = \false; + /** + * @var \Symfony\Component\Console\Command\Command|null + */ + private $runningCommand; + /** + * @var string + */ + private $name; + /** + * @var string + */ + private $version; + /** + * @var \Symfony\Component\Console\CommandLoader\CommandLoaderInterface|null + */ + private $commandLoader; + /** + * @var bool + */ + private $catchExceptions = \true; + /** + * @var bool + */ + private $catchErrors = \false; + /** + * @var bool + */ + private $autoExit = \true; + /** + * @var \Symfony\Component\Console\Input\InputDefinition + */ + private $definition; + /** + * @var \Symfony\Component\Console\Helper\HelperSet + */ + private $helperSet; + /** + * @var \Symfony\Contracts\EventDispatcher\EventDispatcherInterface|null + */ + private $dispatcher; + /** + * @var \Symfony\Component\Console\Terminal + */ + private $terminal; + /** + * @var string + */ + private $defaultCommand; + /** + * @var bool + */ + private $singleCommand = \false; + /** + * @var bool + */ + private $initialized = \false; + /** + * @var \Symfony\Component\Console\SignalRegistry\SignalRegistry|null + */ + private $signalRegistry; + /** + * @var mixed[] + */ + private $signalsToDispatchEvent = []; + public function __construct(string $name = 'UNKNOWN', string $version = 'UNKNOWN') + { + $this->name = $name; + $this->version = $version; + $this->terminal = new Terminal(); + $this->defaultCommand = 'list'; + if (\defined('SIGINT') && SignalRegistry::isSupported()) { + $this->signalRegistry = new SignalRegistry(); + $this->signalsToDispatchEvent = [\SIGINT, \SIGTERM, \SIGUSR1, \SIGUSR2]; + } + } + /** + * @final + */ + public function setDispatcher(EventDispatcherInterface $dispatcher) : void + { + $this->dispatcher = $dispatcher; + } + /** + * @return void + */ + public function setCommandLoader(CommandLoaderInterface $commandLoader) + { + $this->commandLoader = $commandLoader; + } + public function getSignalRegistry() : SignalRegistry + { + if (!$this->signalRegistry) { + throw new RuntimeException('Signals are not supported. Make sure that the "pcntl" extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.'); + } + return $this->signalRegistry; + } + /** + * @return void + */ + public function setSignalsToDispatchEvent(int ...$signalsToDispatchEvent) + { + $this->signalsToDispatchEvent = $signalsToDispatchEvent; + } + /** + * Runs the current application. + * + * @return int 0 if everything went fine, or an error code + * + * @throws \Exception When running fails. Bypass this when {@link setCatchExceptions()}. + */ + public function run(?InputInterface $input = null, ?OutputInterface $output = null) : int + { + if (\function_exists('putenv')) { + @\putenv('LINES=' . $this->terminal->getHeight()); + @\putenv('COLUMNS=' . $this->terminal->getWidth()); + } + $input = $input ?? new ArgvInput(); + $output = $output ?? new ConsoleOutput(); + $renderException = function (\Throwable $e) use($output) { + if ($output instanceof ConsoleOutputInterface) { + $this->renderThrowable($e, $output->getErrorOutput()); + } else { + $this->renderThrowable($e, $output); + } + }; + if ($phpHandler = \set_exception_handler($renderException)) { + \restore_exception_handler(); + if (!\is_array($phpHandler) || !$phpHandler[0] instanceof ErrorHandler) { + $errorHandler = \true; + } elseif ($errorHandler = $phpHandler[0]->setExceptionHandler($renderException)) { + $phpHandler[0]->setExceptionHandler($errorHandler); + } + } + $this->configureIO($input, $output); + try { + $exitCode = $this->doRun($input, $output); + } catch (\Throwable $e) { + if ($e instanceof \Exception && !$this->catchExceptions) { + throw $e; + } + if (!$e instanceof \Exception && !$this->catchErrors) { + throw $e; + } + $renderException($e); + $exitCode = $e->getCode(); + if (\is_numeric($exitCode)) { + $exitCode = (int) $exitCode; + if ($exitCode <= 0) { + $exitCode = 1; + } + } else { + $exitCode = 1; + } + } finally { + // if the exception handler changed, keep it + // otherwise, unregister $renderException + if (!$phpHandler) { + if (\set_exception_handler($renderException) === $renderException) { + \restore_exception_handler(); + } + \restore_exception_handler(); + } elseif (!$errorHandler) { + $finalHandler = $phpHandler[0]->setExceptionHandler(null); + if ($finalHandler !== $renderException) { + $phpHandler[0]->setExceptionHandler($finalHandler); + } + } + } + if ($this->autoExit) { + if ($exitCode > 255) { + $exitCode = 255; + } + exit($exitCode); + } + return $exitCode; + } + /** + * Runs the current application. + * + * @return int 0 if everything went fine, or an error code + */ + public function doRun(InputInterface $input, OutputInterface $output) + { + if (\true === $input->hasParameterOption(['--version', '-V'], \true)) { + $output->writeln($this->getLongVersion()); + return 0; + } + try { + // Makes ArgvInput::getFirstArgument() able to distinguish an option from an argument. + $input->bind($this->getDefinition()); + } catch (ExceptionInterface $exception) { + // Errors must be ignored, full binding/validation happens later when the command is known. + } + $name = $this->getCommandName($input); + if (\true === $input->hasParameterOption(['--help', '-h'], \true)) { + if (!$name) { + $name = 'help'; + $input = new ArrayInput(['command_name' => $this->defaultCommand]); + } else { + $this->wantHelps = \true; + } + } + if (!$name) { + $name = $this->defaultCommand; + $definition = $this->getDefinition(); + $definition->setArguments(\array_merge($definition->getArguments(), ['command' => new InputArgument('command', InputArgument::OPTIONAL, $definition->getArgument('command')->getDescription(), $name)])); + } + try { + $this->runningCommand = null; + // the command name MUST be the first element of the input + $command = $this->find($name); + } catch (\Throwable $e) { + if ($e instanceof CommandNotFoundException && !$e instanceof NamespaceNotFoundException && 1 === \count($alternatives = $e->getAlternatives()) && $input->isInteractive()) { + $alternative = $alternatives[0]; + $style = new SymfonyStyle($input, $output); + $output->writeln(''); + $formattedBlock = (new FormatterHelper())->formatBlock(\sprintf('Command "%s" is not defined.', $name), 'error', \true); + $output->writeln($formattedBlock); + if (!$style->confirm(\sprintf('Do you want to run "%s" instead? ', $alternative), \false)) { + if (null !== $this->dispatcher) { + $event = new ConsoleErrorEvent($input, $output, $e); + $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); + return $event->getExitCode(); + } + return 1; + } + $command = $this->find($alternative); + } else { + if (null !== $this->dispatcher) { + $event = new ConsoleErrorEvent($input, $output, $e); + $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); + if (0 === $event->getExitCode()) { + return 0; + } + $e = $event->getError(); + } + try { + if ($e instanceof CommandNotFoundException && ($namespace = $this->findNamespace($name))) { + $helper = new DescriptorHelper(); + $helper->describe($output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output, $this, ['format' => 'txt', 'raw_text' => \false, 'namespace' => $namespace, 'short' => \false]); + return isset($event) ? $event->getExitCode() : 1; + } + throw $e; + } catch (NamespaceNotFoundException $exception) { + throw $e; + } + } + } + if ($command instanceof LazyCommand) { + $command = $command->getCommand(); + } + $this->runningCommand = $command; + $exitCode = $this->doRunCommand($command, $input, $output); + $this->runningCommand = null; + return $exitCode; + } + /** + * @return void + */ + public function reset() + { + } + /** + * @return void + */ + public function setHelperSet(HelperSet $helperSet) + { + $this->helperSet = $helperSet; + } + /** + * Get the helper set associated with the command. + */ + public function getHelperSet() : HelperSet + { + return $this->helperSet = $this->helperSet ?? $this->getDefaultHelperSet(); + } + /** + * @return void + */ + public function setDefinition(InputDefinition $definition) + { + $this->definition = $definition; + } + /** + * Gets the InputDefinition related to this Application. + */ + public function getDefinition() : InputDefinition + { + $this->definition = $this->definition ?? $this->getDefaultInputDefinition(); + if ($this->singleCommand) { + $inputDefinition = $this->definition; + $inputDefinition->setArguments(); + return $inputDefinition; + } + return $this->definition; + } + /** + * Adds suggestions to $suggestions for the current completion input (e.g. option or argument). + */ + public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void + { + if (CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType() && 'command' === $input->getCompletionName()) { + foreach ($this->all() as $name => $command) { + // skip hidden commands and aliased commands as they already get added below + if ($command->isHidden() || $command->getName() !== $name) { + continue; + } + $suggestions->suggestValue(new Suggestion($command->getName(), $command->getDescription())); + foreach ($command->getAliases() as $name) { + $suggestions->suggestValue(new Suggestion($name, $command->getDescription())); + } + } + return; + } + if (CompletionInput::TYPE_OPTION_NAME === $input->getCompletionType()) { + $suggestions->suggestOptions($this->getDefinition()->getOptions()); + return; + } + } + /** + * Gets the help message. + */ + public function getHelp() : string + { + return $this->getLongVersion(); + } + /** + * Gets whether to catch exceptions or not during commands execution. + */ + public function areExceptionsCaught() : bool + { + return $this->catchExceptions; + } + /** + * Sets whether to catch exceptions or not during commands execution. + * + * @return void + */ + public function setCatchExceptions(bool $boolean) + { + $this->catchExceptions = $boolean; + } + /** + * Sets whether to catch errors or not during commands execution. + */ + public function setCatchErrors(bool $catchErrors = \true) : void + { + $this->catchErrors = $catchErrors; + } + /** + * Gets whether to automatically exit after a command execution or not. + */ + public function isAutoExitEnabled() : bool + { + return $this->autoExit; + } + /** + * Sets whether to automatically exit after a command execution or not. + * + * @return void + */ + public function setAutoExit(bool $boolean) + { + $this->autoExit = $boolean; + } + /** + * Gets the name of the application. + */ + public function getName() : string + { + return $this->name; + } + /** + * Sets the application name. + * + * @return void + */ + public function setName(string $name) + { + $this->name = $name; + } + /** + * Gets the application version. + */ + public function getVersion() : string + { + return $this->version; + } + /** + * Sets the application version. + * + * @return void + */ + public function setVersion(string $version) + { + $this->version = $version; + } + /** + * Returns the long version of the application. + * + * @return string + */ + public function getLongVersion() + { + if ('UNKNOWN' !== $this->getName()) { + if ('UNKNOWN' !== $this->getVersion()) { + return \sprintf('%s %s', $this->getName(), $this->getVersion()); + } + return $this->getName(); + } + return 'Console Tool'; + } + /** + * Registers a new command. + */ + public function register(string $name) : Command + { + return $this->add(new Command($name)); + } + /** + * Adds an array of command objects. + * + * If a Command is not enabled it will not be added. + * + * @param Command[] $commands An array of commands + * + * @return void + */ + public function addCommands(array $commands) + { + foreach ($commands as $command) { + $this->add($command); + } + } + /** + * Adds a command object. + * + * If a command with the same name already exists, it will be overridden. + * If the command is not enabled it will not be added. + * + * @return Command|null + */ + public function add(Command $command) + { + $this->init(); + $command->setApplication($this); + if (!$command->isEnabled()) { + $command->setApplication(null); + return null; + } + if (!$command instanceof LazyCommand) { + // Will throw if the command is not correctly initialized. + $command->getDefinition(); + } + if (!$command->getName()) { + throw new LogicException(\sprintf('The command defined in "%s" cannot have an empty name.', \get_debug_type($command))); + } + $this->commands[$command->getName()] = $command; + foreach ($command->getAliases() as $alias) { + $this->commands[$alias] = $command; + } + return $command; + } + /** + * Returns a registered command by name or alias. + * + * @return Command + * + * @throws CommandNotFoundException When given command name does not exist + */ + public function get(string $name) + { + $this->init(); + if (!$this->has($name)) { + throw new CommandNotFoundException(\sprintf('The command "%s" does not exist.', $name)); + } + // When the command has a different name than the one used at the command loader level + if (!isset($this->commands[$name])) { + throw new CommandNotFoundException(\sprintf('The "%s" command cannot be found because it is registered under multiple names. Make sure you don\'t set a different name via constructor or "setName()".', $name)); + } + $command = $this->commands[$name]; + if ($this->wantHelps) { + $this->wantHelps = \false; + $helpCommand = $this->get('help'); + $helpCommand->setCommand($command); + return $helpCommand; + } + return $command; + } + /** + * Returns true if the command exists, false otherwise. + */ + public function has(string $name) : bool + { + $this->init(); + return isset($this->commands[$name]) || (($nullsafeVariable1 = $this->commandLoader) ? $nullsafeVariable1->has($name) : null) && $this->add($this->commandLoader->get($name)); + } + /** + * Returns an array of all unique namespaces used by currently registered commands. + * + * It does not return the global namespace which always exists. + * + * @return string[] + */ + public function getNamespaces() : array + { + $namespaces = []; + foreach ($this->all() as $command) { + if ($command->isHidden()) { + continue; + } + $namespaces[] = $this->extractAllNamespaces($command->getName()); + foreach ($command->getAliases() as $alias) { + $namespaces[] = $this->extractAllNamespaces($alias); + } + } + return \array_values(\array_unique(\array_filter(\array_merge([], ...$namespaces)))); + } + /** + * Finds a registered namespace by a name or an abbreviation. + * + * @throws NamespaceNotFoundException When namespace is incorrect or ambiguous + */ + public function findNamespace(string $namespace) : string + { + $allNamespaces = $this->getNamespaces(); + $expr = \implode('[^:]*:', \array_map('preg_quote', \explode(':', $namespace))) . '[^:]*'; + $namespaces = \preg_grep('{^' . $expr . '}', $allNamespaces); + if (empty($namespaces)) { + $message = \sprintf('There are no commands defined in the "%s" namespace.', $namespace); + if ($alternatives = $this->findAlternatives($namespace, $allNamespaces)) { + if (1 == \count($alternatives)) { + $message .= "\n\nDid you mean this?\n "; + } else { + $message .= "\n\nDid you mean one of these?\n "; + } + $message .= \implode("\n ", $alternatives); + } + throw new NamespaceNotFoundException($message, $alternatives); + } + $exact = \in_array($namespace, $namespaces, \true); + if (\count($namespaces) > 1 && !$exact) { + throw new NamespaceNotFoundException(\sprintf("The namespace \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $namespace, $this->getAbbreviationSuggestions(\array_values($namespaces))), \array_values($namespaces)); + } + return $exact ? $namespace : \reset($namespaces); + } + /** + * Finds a command by name or alias. + * + * Contrary to get, this command tries to find the best + * match if you give it an abbreviation of a name or alias. + * + * @return Command + * + * @throws CommandNotFoundException When command name is incorrect or ambiguous + */ + public function find(string $name) + { + $this->init(); + $aliases = []; + foreach ($this->commands as $command) { + foreach ($command->getAliases() as $alias) { + if (!$this->has($alias)) { + $this->commands[$alias] = $command; + } + } + } + if ($this->has($name)) { + return $this->get($name); + } + $allCommands = $this->commandLoader ? \array_merge($this->commandLoader->getNames(), \array_keys($this->commands)) : \array_keys($this->commands); + $expr = \implode('[^:]*:', \array_map('preg_quote', \explode(':', $name))) . '[^:]*'; + $commands = \preg_grep('{^' . $expr . '}', $allCommands); + if (empty($commands)) { + $commands = \preg_grep('{^' . $expr . '}i', $allCommands); + } + // if no commands matched or we just matched namespaces + if (empty($commands) || \count(\preg_grep('{^' . $expr . '$}i', $commands)) < 1) { + if (\false !== ($pos = \strrpos($name, ':'))) { + // check if a namespace exists and contains commands + $this->findNamespace(\substr($name, 0, $pos)); + } + $message = \sprintf('Command "%s" is not defined.', $name); + if ($alternatives = $this->findAlternatives($name, $allCommands)) { + // remove hidden commands + $alternatives = \array_filter($alternatives, function ($name) { + return !$this->get($name)->isHidden(); + }); + if (1 == \count($alternatives)) { + $message .= "\n\nDid you mean this?\n "; + } else { + $message .= "\n\nDid you mean one of these?\n "; + } + $message .= \implode("\n ", $alternatives); + } + throw new CommandNotFoundException($message, \array_values($alternatives)); + } + // filter out aliases for commands which are already on the list + if (\count($commands) > 1) { + $commandList = $this->commandLoader ? \array_merge(\array_flip($this->commandLoader->getNames()), $this->commands) : $this->commands; + $commands = \array_unique(\array_filter($commands, function ($nameOrAlias) use(&$commandList, $commands, &$aliases) { + if (!$commandList[$nameOrAlias] instanceof Command) { + $commandList[$nameOrAlias] = $this->commandLoader->get($nameOrAlias); + } + $commandName = $commandList[$nameOrAlias]->getName(); + $aliases[$nameOrAlias] = $commandName; + return $commandName === $nameOrAlias || !\in_array($commandName, $commands); + })); + } + if (\count($commands) > 1) { + $usableWidth = $this->terminal->getWidth() - 10; + $abbrevs = \array_values($commands); + $maxLen = 0; + foreach ($abbrevs as $abbrev) { + $maxLen = \max(Helper::width($abbrev), $maxLen); + } + $abbrevs = \array_map(function ($cmd) use($commandList, $usableWidth, $maxLen, &$commands) { + if ($commandList[$cmd]->isHidden()) { + unset($commands[\array_search($cmd, $commands)]); + return \false; + } + $abbrev = \str_pad($cmd, $maxLen, ' ') . ' ' . $commandList[$cmd]->getDescription(); + return Helper::width($abbrev) > $usableWidth ? Helper::substr($abbrev, 0, $usableWidth - 3) . '...' : $abbrev; + }, \array_values($commands)); + if (\count($commands) > 1) { + $suggestions = $this->getAbbreviationSuggestions(\array_filter($abbrevs)); + throw new CommandNotFoundException(\sprintf("Command \"%s\" is ambiguous.\nDid you mean one of these?\n%s.", $name, $suggestions), \array_values($commands)); + } + } + $command = $this->get(\reset($commands)); + if ($command->isHidden()) { + throw new CommandNotFoundException(\sprintf('The command "%s" does not exist.', $name)); + } + return $command; + } + /** + * Gets the commands (registered in the given namespace if provided). + * + * The array keys are the full names and the values the command instances. + * + * @return Command[] + */ + public function all(?string $namespace = null) + { + $this->init(); + if (null === $namespace) { + if (!$this->commandLoader) { + return $this->commands; + } + $commands = $this->commands; + foreach ($this->commandLoader->getNames() as $name) { + if (!isset($commands[$name]) && $this->has($name)) { + $commands[$name] = $this->get($name); + } + } + return $commands; + } + $commands = []; + foreach ($this->commands as $name => $command) { + if ($namespace === $this->extractNamespace($name, \substr_count($namespace, ':') + 1)) { + $commands[$name] = $command; + } + } + if ($this->commandLoader) { + foreach ($this->commandLoader->getNames() as $name) { + if (!isset($commands[$name]) && $namespace === $this->extractNamespace($name, \substr_count($namespace, ':') + 1) && $this->has($name)) { + $commands[$name] = $this->get($name); + } + } + } + return $commands; + } + /** + * Returns an array of possible abbreviations given a set of names. + * + * @return string[][] + */ + public static function getAbbreviations(array $names) : array + { + $abbrevs = []; + foreach ($names as $name) { + for ($len = \strlen($name); $len > 0; --$len) { + $abbrev = \substr($name, 0, $len); + $abbrevs[$abbrev][] = $name; + } + } + return $abbrevs; + } + public function renderThrowable(\Throwable $e, OutputInterface $output) : void + { + $output->writeln('', OutputInterface::VERBOSITY_QUIET); + $this->doRenderThrowable($e, $output); + if (null !== $this->runningCommand) { + $output->writeln(\sprintf('%s', OutputFormatter::escape(\sprintf($this->runningCommand->getSynopsis(), $this->getName()))), OutputInterface::VERBOSITY_QUIET); + $output->writeln('', OutputInterface::VERBOSITY_QUIET); + } + } + protected function doRenderThrowable(\Throwable $e, OutputInterface $output) : void + { + do { + $message = \trim($e->getMessage()); + if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { + $class = \get_debug_type($e); + $title = \sprintf(' [%s%s] ', $class, 0 !== ($code = $e->getCode()) ? ' (' . $code . ')' : ''); + $len = Helper::width($title); + } else { + $len = 0; + } + if (\strpos($message, "@anonymous\x00") !== \false) { + $message = \preg_replace_callback('/[a-zA-Z_\\x7f-\\xff][\\\\a-zA-Z0-9_\\x7f-\\xff]*+@anonymous\\x00.*?\\.php(?:0x?|:[0-9]++\\$)[0-9a-fA-F]++/', function ($m) { + return \class_exists($m[0], \false) ? ((\get_parent_class($m[0]) ?: \key(\class_implements($m[0]))) ?: 'class') . '@anonymous' : $m[0]; + }, $message); + } + $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : \PHP_INT_MAX; + $lines = []; + foreach ('' !== $message ? \preg_split('/\\r?\\n/', $message) : [] as $line) { + foreach ($this->splitStringByWidth($line, $width - 4) as $line) { + // pre-format lines to get the right string length + $lineLength = Helper::width($line) + 4; + $lines[] = [$line, $lineLength]; + $len = \max($lineLength, $len); + } + } + $messages = []; + if (!$e instanceof ExceptionInterface || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { + $messages[] = \sprintf('%s', OutputFormatter::escape(\sprintf('In %s line %s:', \basename($e->getFile()) ?: 'n/a', $e->getLine() ?: 'n/a'))); + } + $messages[] = $emptyLine = \sprintf('%s', \str_repeat(' ', $len)); + if ('' === $message || OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { + $messages[] = \sprintf('%s%s', $title, \str_repeat(' ', \max(0, $len - Helper::width($title)))); + } + foreach ($lines as $line) { + $messages[] = \sprintf(' %s %s', OutputFormatter::escape($line[0]), \str_repeat(' ', $len - $line[1])); + } + $messages[] = $emptyLine; + $messages[] = ''; + $output->writeln($messages, OutputInterface::VERBOSITY_QUIET); + if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { + $output->writeln('Exception trace:', OutputInterface::VERBOSITY_QUIET); + // exception related properties + $trace = $e->getTrace(); + \array_unshift($trace, ['function' => '', 'file' => $e->getFile() ?: 'n/a', 'line' => $e->getLine() ?: 'n/a', 'args' => []]); + for ($i = 0, $count = \count($trace); $i < $count; ++$i) { + $class = $trace[$i]['class'] ?? ''; + $type = $trace[$i]['type'] ?? ''; + $function = $trace[$i]['function'] ?? ''; + $file = $trace[$i]['file'] ?? 'n/a'; + $line = $trace[$i]['line'] ?? 'n/a'; + $output->writeln(\sprintf(' %s%s at %s:%s', $class, $function ? $type . $function . '()' : '', $file, $line), OutputInterface::VERBOSITY_QUIET); + } + $output->writeln('', OutputInterface::VERBOSITY_QUIET); + } + } while ($e = $e->getPrevious()); + } + /** + * Configures the input and output instances based on the user arguments and options. + * + * @return void + */ + protected function configureIO(InputInterface $input, OutputInterface $output) + { + if (\true === $input->hasParameterOption(['--ansi'], \true)) { + $output->setDecorated(\true); + } elseif (\true === $input->hasParameterOption(['--no-ansi'], \true)) { + $output->setDecorated(\false); + } + if (\true === $input->hasParameterOption(['--no-interaction', '-n'], \true)) { + $input->setInteractive(\false); + } + switch ($shellVerbosity = (int) \getenv('SHELL_VERBOSITY')) { + case -1: + $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); + break; + case 1: + $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); + break; + case 2: + $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); + break; + case 3: + $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); + break; + default: + $shellVerbosity = 0; + break; + } + if (\true === $input->hasParameterOption(['--quiet', '-q'], \true)) { + $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); + $shellVerbosity = -1; + } else { + if ($input->hasParameterOption('-vvv', \true) || $input->hasParameterOption('--verbose=3', \true) || 3 === $input->getParameterOption('--verbose', \false, \true)) { + $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); + $shellVerbosity = 3; + } elseif ($input->hasParameterOption('-vv', \true) || $input->hasParameterOption('--verbose=2', \true) || 2 === $input->getParameterOption('--verbose', \false, \true)) { + $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); + $shellVerbosity = 2; + } elseif ($input->hasParameterOption('-v', \true) || $input->hasParameterOption('--verbose=1', \true) || $input->hasParameterOption('--verbose', \true) || $input->getParameterOption('--verbose', \false, \true)) { + $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); + $shellVerbosity = 1; + } + } + if (-1 === $shellVerbosity) { + $input->setInteractive(\false); + } + if (\function_exists('putenv')) { + @\putenv('SHELL_VERBOSITY=' . $shellVerbosity); + } + $_ENV['SHELL_VERBOSITY'] = $shellVerbosity; + $_SERVER['SHELL_VERBOSITY'] = $shellVerbosity; + } + /** + * Runs the current command. + * + * If an event dispatcher has been attached to the application, + * events are also dispatched during the life-cycle of the command. + * + * @return int 0 if everything went fine, or an error code + */ + protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output) + { + foreach ($command->getHelperSet() as $helper) { + if ($helper instanceof InputAwareInterface) { + $helper->setInput($input); + } + } + $commandSignals = $command instanceof SignalableCommandInterface ? $command->getSubscribedSignals() : []; + if ($commandSignals || $this->dispatcher && $this->signalsToDispatchEvent) { + if (!$this->signalRegistry) { + throw new RuntimeException('Unable to subscribe to signal events. Make sure that the "pcntl" extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.'); + } + if (Terminal::hasSttyAvailable()) { + $sttyMode = \shell_exec('stty -g'); + foreach ([\SIGINT, \SIGTERM] as $signal) { + $this->signalRegistry->register($signal, static function () use($sttyMode) { + return \shell_exec('stty ' . $sttyMode); + }); + } + } + if ($this->dispatcher) { + // We register application signals, so that we can dispatch the event + foreach ($this->signalsToDispatchEvent as $signal) { + $event = new ConsoleSignalEvent($command, $input, $output, $signal); + $this->signalRegistry->register($signal, function ($signal) use($event, $command, $commandSignals) { + $this->dispatcher->dispatch($event, ConsoleEvents::SIGNAL); + $exitCode = $event->getExitCode(); + // If the command is signalable, we call the handleSignal() method + if (\in_array($signal, $commandSignals, \true)) { + $exitCode = $command->handleSignal($signal, $exitCode); + // BC layer for Symfony <= 5 + if (null === $exitCode) { + trigger_deprecation('symfony/console', '6.3', 'Not returning an exit code from "%s::handleSignal()" is deprecated, return "false" to keep the command running or "0" to exit successfully.', \get_debug_type($command)); + $exitCode = 0; + } + } + if (\false !== $exitCode) { + $event = new ConsoleTerminateEvent($command, $event->getInput(), $event->getOutput(), $exitCode, $signal); + $this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE); + exit($event->getExitCode()); + } + }); + } + // then we register command signals, but not if already handled after the dispatcher + $commandSignals = \array_diff($commandSignals, $this->signalsToDispatchEvent); + } + foreach ($commandSignals as $signal) { + $this->signalRegistry->register($signal, function (int $signal) use($command) : void { + $exitCode = $command->handleSignal($signal); + // BC layer for Symfony <= 5 + if (null === $exitCode) { + trigger_deprecation('symfony/console', '6.3', 'Not returning an exit code from "%s::handleSignal()" is deprecated, return "false" to keep the command running or "0" to exit successfully.', \get_debug_type($command)); + $exitCode = 0; + } + if (\false !== $exitCode) { + exit($exitCode); + } + }); + } + } + if (null === $this->dispatcher) { + return $command->run($input, $output); + } + // bind before the console.command event, so the listeners have access to input options/arguments + try { + $command->mergeApplicationDefinition(); + $input->bind($command->getDefinition()); + } catch (ExceptionInterface $exception) { + // ignore invalid options/arguments for now, to allow the event listeners to customize the InputDefinition + } + $event = new ConsoleCommandEvent($command, $input, $output); + $e = null; + try { + $this->dispatcher->dispatch($event, ConsoleEvents::COMMAND); + if ($event->commandShouldRun()) { + $exitCode = $command->run($input, $output); + } else { + $exitCode = ConsoleCommandEvent::RETURN_CODE_DISABLED; + } + } catch (\Throwable $e) { + $event = new ConsoleErrorEvent($input, $output, $e, $command); + $this->dispatcher->dispatch($event, ConsoleEvents::ERROR); + $e = $event->getError(); + if (0 === ($exitCode = $event->getExitCode())) { + $e = null; + } + } + $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode); + $this->dispatcher->dispatch($event, ConsoleEvents::TERMINATE); + if (null !== $e) { + throw $e; + } + return $event->getExitCode(); + } + /** + * Gets the name of the command based on input. + */ + protected function getCommandName(InputInterface $input) : ?string + { + return $this->singleCommand ? $this->defaultCommand : $input->getFirstArgument(); + } + /** + * Gets the default input definition. + */ + protected function getDefaultInputDefinition() : InputDefinition + { + return new InputDefinition([new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display help for the given command. When no command is given display help for the ' . $this->defaultCommand . ' command'), new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message'), new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'), new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version'), new InputOption('--ansi', '', InputOption::VALUE_NEGATABLE, 'Force (or disable --no-ansi) ANSI output', null), new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question')]); + } + /** + * Gets the default commands that should always be available. + * + * @return Command[] + */ + protected function getDefaultCommands() : array + { + return [new HelpCommand(), new ListCommand(), new CompleteCommand(), new DumpCompletionCommand()]; + } + /** + * Gets the default helper set with the helpers that should always be available. + */ + protected function getDefaultHelperSet() : HelperSet + { + return new HelperSet([new FormatterHelper(), new DebugFormatterHelper(), new ProcessHelper(), new QuestionHelper()]); + } + /** + * Returns abbreviated suggestions in string format. + */ + private function getAbbreviationSuggestions(array $abbrevs) : string + { + return ' ' . \implode("\n ", $abbrevs); + } + /** + * Returns the namespace part of the command name. + * + * This method is not part of public API and should not be used directly. + */ + public function extractNamespace(string $name, ?int $limit = null) : string + { + $parts = \explode(':', $name, -1); + return \implode(':', null === $limit ? $parts : \array_slice($parts, 0, $limit)); + } + /** + * Finds alternative of $name among $collection, + * if nothing is found in $collection, try in $abbrevs. + * + * @return string[] + */ + private function findAlternatives(string $name, iterable $collection) : array + { + $threshold = 1000.0; + $alternatives = []; + $collectionParts = []; + foreach ($collection as $item) { + $collectionParts[$item] = \explode(':', $item); + } + foreach (\explode(':', $name) as $i => $subname) { + foreach ($collectionParts as $collectionName => $parts) { + $exists = isset($alternatives[$collectionName]); + if (!isset($parts[$i]) && $exists) { + $alternatives[$collectionName] += $threshold; + continue; + } elseif (!isset($parts[$i])) { + continue; + } + $lev = \levenshtein($subname, $parts[$i]); + if ($lev <= \strlen($subname) / 3 || '' !== $subname && \strpos($parts[$i], $subname) !== \false) { + $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev; + } elseif ($exists) { + $alternatives[$collectionName] += $threshold; + } + } + } + foreach ($collection as $item) { + $lev = \levenshtein($name, $item); + if ($lev <= \strlen($name) / 3 || \strpos($item, $name) !== \false) { + $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev; + } + } + $alternatives = \array_filter($alternatives, function ($lev) use($threshold) { + return $lev < 2 * $threshold; + }); + \ksort($alternatives, \SORT_NATURAL | \SORT_FLAG_CASE); + return \array_keys($alternatives); + } + /** + * Sets the default Command name. + * + * @return $this + */ + public function setDefaultCommand(string $commandName, bool $isSingleCommand = \false) + { + $this->defaultCommand = \explode('|', \ltrim($commandName, '|'))[0]; + if ($isSingleCommand) { + // Ensure the command exist + $this->find($commandName); + $this->singleCommand = \true; + } + return $this; + } + /** + * @internal + */ + public function isSingleCommand() : bool + { + return $this->singleCommand; + } + private function splitStringByWidth(string $string, int $width) : array + { + // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly. + // additionally, array_slice() is not enough as some character has doubled width. + // we need a function to split string not by character count but by string width + if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) { + return \str_split($string, $width); + } + $utf8String = \mb_convert_encoding($string, 'utf8', $encoding); + $lines = []; + $line = ''; + $offset = 0; + while (\preg_match('/.{1,10000}/u', $utf8String, $m, 0, $offset)) { + $offset += \strlen($m[0]); + foreach (\preg_split('//u', $m[0]) as $char) { + // test if $char could be appended to current line + if (\mb_strwidth($line . $char, 'utf8') <= $width) { + $line .= $char; + continue; + } + // if not, push current line to array and make new line + $lines[] = \str_pad($line, $width); + $line = $char; + } + } + $lines[] = \count($lines) ? \str_pad($line, $width) : $line; + \mb_convert_variables($encoding, 'utf8', $lines); + return $lines; + } + /** + * Returns all namespaces of the command name. + * + * @return string[] + */ + private function extractAllNamespaces(string $name) : array + { + // -1 as third argument is needed to skip the command short name when exploding + $parts = \explode(':', $name, -1); + $namespaces = []; + foreach ($parts as $part) { + if (\count($namespaces)) { + $namespaces[] = \end($namespaces) . ':' . $part; + } else { + $namespaces[] = $part; + } + } + return $namespaces; + } + private function init() : void + { + if ($this->initialized) { + return; + } + $this->initialized = \true; + foreach ($this->getDefaultCommands() as $command) { + $this->add($command); + } + } +} diff --git a/vendor/symfony/console/Attribute/AsCommand.php b/vendor/symfony/console/Attribute/AsCommand.php new file mode 100644 index 00000000..d2017567 --- /dev/null +++ b/vendor/symfony/console/Attribute/AsCommand.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Attribute; + +/** + * Service tag to autoconfigure commands. + */ +#[\Attribute(\Attribute::TARGET_CLASS)] +class AsCommand +{ + /** + * @var string + */ + public $name; + /** + * @var string|null + */ + public $description; + public function __construct(string $name, ?string $description = null, array $aliases = [], bool $hidden = \false) + { + $this->name = $name; + $this->description = $description; + if (!$hidden && !$aliases) { + return; + } + $name = \explode('|', $name); + $name = \array_merge($name, $aliases); + if ($hidden && '' !== $name[0]) { + \array_unshift($name, ''); + } + $this->name = \implode('|', $name); + } +} diff --git a/vendor/symfony/console/CHANGELOG.md b/vendor/symfony/console/CHANGELOG.md new file mode 100644 index 00000000..9ccb41d9 --- /dev/null +++ b/vendor/symfony/console/CHANGELOG.md @@ -0,0 +1,261 @@ +CHANGELOG +========= + +6.4 +--- + + * Add `SignalMap` to map signal value to its name + * Multi-line text in vertical tables is aligned properly + * The application can also catch errors with `Application::setCatchErrors(true)` + * Add `RunCommandMessage` and `RunCommandMessageHandler` + * Dispatch `ConsoleTerminateEvent` after an exit on signal handling and add `ConsoleTerminateEvent::getInterruptingSignal()` + +6.3 +--- + + * Add support for choosing exit code while handling signal, or to not exit at all + * Add `ProgressBar::setPlaceholderFormatter` to set a placeholder attached to a instance, instead of being global. + * Add `ReStructuredTextDescriptor` + +6.2 +--- + + * Improve truecolor terminal detection in some cases + * Add support for 256 color terminals (conversion from Ansi24 to Ansi8 if terminal is capable of it) + * Deprecate calling `*Command::setApplication()`, `*FormatterStyle::setForeground/setBackground()`, `Helper::setHelpSet()`, `Input*::setDefault()`, `Question::setAutocompleterCallback/setValidator()`without any arguments + * Change the signature of `OutputFormatterStyleInterface::setForeground/setBackground()` to `setForeground/setBackground(?string)` + * Change the signature of `HelperInterface::setHelperSet()` to `setHelperSet(?HelperSet)` + +6.1 +--- + + * Add support to display table vertically when calling setVertical() + * Add method `__toString()` to `InputInterface` + * Added `OutputWrapper` to prevent truncated URL in `SymfonyStyle::createBlock`. + * Deprecate `Command::$defaultName` and `Command::$defaultDescription`, use the `AsCommand` attribute instead + * Add suggested values for arguments and options in input definition, for input completion + * Add `$resumeAt` parameter to `ProgressBar#start()`, so that one can easily 'resume' progress on longer tasks, and still get accurate `getEstimate()` and `getRemaining()` results. + +6.0 +--- + + * `Command::setHidden()` has a default value (`true`) for `$hidden` parameter and is final + * Remove `Helper::strlen()`, use `Helper::width()` instead + * Remove `Helper::strlenWithoutDecoration()`, use `Helper::removeDecoration()` instead + * `AddConsoleCommandPass` can not be configured anymore + * Remove `HelperSet::setCommand()` and `getCommand()` without replacement + +5.4 +--- + + * Add `TesterTrait::assertCommandIsSuccessful()` to test command + * Deprecate `HelperSet::setCommand()` and `getCommand()` without replacement + +5.3 +--- + + * Add `GithubActionReporter` to render annotations in a Github Action + * Add `InputOption::VALUE_NEGATABLE` flag to handle `--foo`/`--no-foo` options + * Add the `Command::$defaultDescription` static property and the `description` attribute + on the `console.command` tag to allow the `list` command to instantiate commands lazily + * Add option `--short` to the `list` command + * Add support for bright colors + * Add `#[AsCommand]` attribute for declaring commands on PHP 8 + * Add `Helper::width()` and `Helper::length()` + * The `--ansi` and `--no-ansi` options now default to `null`. + +5.2.0 +----- + + * Added `SingleCommandApplication::setAutoExit()` to allow testing via `CommandTester` + * added support for multiline responses to questions through `Question::setMultiline()` + and `Question::isMultiline()` + * Added `SignalRegistry` class to stack signals handlers + * Added support for signals: + * Added `Application::getSignalRegistry()` and `Application::setSignalsToDispatchEvent()` methods + * Added `SignalableCommandInterface` interface + * Added `TableCellStyle` class to customize table cell + * Removed `php ` prefix invocation from help messages. + +5.1.0 +----- + + * `Command::setHidden()` is final since Symfony 5.1 + * Add `SingleCommandApplication` + * Add `Cursor` class + +5.0.0 +----- + + * removed support for finding hidden commands using an abbreviation, use the full name instead + * removed `TableStyle::setCrossingChar()` method in favor of `TableStyle::setDefaultCrossingChar()` + * removed `TableStyle::setHorizontalBorderChar()` method in favor of `TableStyle::setDefaultCrossingChars()` + * removed `TableStyle::getHorizontalBorderChar()` method in favor of `TableStyle::getBorderChars()` + * removed `TableStyle::setVerticalBorderChar()` method in favor of `TableStyle::setVerticalBorderChars()` + * removed `TableStyle::getVerticalBorderChar()` method in favor of `TableStyle::getBorderChars()` + * removed support for returning `null` from `Command::execute()`, return `0` instead + * `ProcessHelper::run()` accepts only `array|Symfony\Component\Process\Process` for its `command` argument + * `Application::setDispatcher` accepts only `Symfony\Contracts\EventDispatcher\EventDispatcherInterface` + for its `dispatcher` argument + * renamed `Application::renderException()` and `Application::doRenderException()` + to `renderThrowable()` and `doRenderThrowable()` respectively. + +4.4.0 +----- + + * deprecated finding hidden commands using an abbreviation, use the full name instead + * added `Question::setTrimmable` default to true to allow the answer to be trimmed + * added method `minSecondsBetweenRedraws()` and `maxSecondsBetweenRedraws()` on `ProgressBar` + * `Application` implements `ResetInterface` + * marked all dispatched event classes as `@final` + * added support for displaying table horizontally + * deprecated returning `null` from `Command::execute()`, return `0` instead + * Deprecated the `Application::renderException()` and `Application::doRenderException()` methods, + use `renderThrowable()` and `doRenderThrowable()` instead. + * added support for the `NO_COLOR` env var (https://no-color.org/) + +4.3.0 +----- + + * added support for hyperlinks + * added `ProgressBar::iterate()` method that simplify updating the progress bar when iterating + * added `Question::setAutocompleterCallback()` to provide a callback function + that dynamically generates suggestions as the user types + +4.2.0 +----- + + * allowed passing commands as `[$process, 'ENV_VAR' => 'value']` to + `ProcessHelper::run()` to pass environment variables + * deprecated passing a command as a string to `ProcessHelper::run()`, + pass it the command as an array of its arguments instead + * made the `ProcessHelper` class final + * added `WrappableOutputFormatterInterface::formatAndWrap()` (implemented in `OutputFormatter`) + * added `capture_stderr_separately` option to `CommandTester::execute()` + +4.1.0 +----- + + * added option to run suggested command if command is not found and only 1 alternative is available + * added option to modify console output and print multiple modifiable sections + * added support for iterable messages in output `write` and `writeln` methods + +4.0.0 +----- + + * `OutputFormatter` throws an exception when unknown options are used + * removed `QuestionHelper::setInputStream()/getInputStream()` + * removed `Application::getTerminalWidth()/getTerminalHeight()` and + `Application::setTerminalDimensions()/getTerminalDimensions()` + * removed `ConsoleExceptionEvent` + * removed `ConsoleEvents::EXCEPTION` + +3.4.0 +----- + + * added `SHELL_VERBOSITY` env var to control verbosity + * added `CommandLoaderInterface`, `FactoryCommandLoader` and PSR-11 + `ContainerCommandLoader` for commands lazy-loading + * added a case-insensitive command name matching fallback + * added static `Command::$defaultName/getDefaultName()`, allowing for + commands to be registered at compile time in the application command loader. + Setting the `$defaultName` property avoids the need for filling the `command` + attribute on the `console.command` tag when using `AddConsoleCommandPass`. + +3.3.0 +----- + + * added `ExceptionListener` + * added `AddConsoleCommandPass` (originally in FrameworkBundle) + * [BC BREAK] `Input::getOption()` no longer returns the default value for options + with value optional explicitly passed empty + * added console.error event to catch exceptions thrown by other listeners + * deprecated console.exception event in favor of console.error + * added ability to handle `CommandNotFoundException` through the + `console.error` event + * deprecated default validation in `SymfonyQuestionHelper::ask` + +3.2.0 +------ + + * added `setInputs()` method to CommandTester for ease testing of commands expecting inputs + * added `setStream()` and `getStream()` methods to Input (implement StreamableInputInterface) + * added StreamableInputInterface + * added LockableTrait + +3.1.0 +----- + + * added truncate method to FormatterHelper + * added setColumnWidth(s) method to Table + +2.8.3 +----- + + * remove readline support from the question helper as it caused issues + +2.8.0 +----- + + * use readline for user input in the question helper when available to allow + the use of arrow keys + +2.6.0 +----- + + * added a Process helper + * added a DebugFormatter helper + +2.5.0 +----- + + * deprecated the dialog helper (use the question helper instead) + * deprecated TableHelper in favor of Table + * deprecated ProgressHelper in favor of ProgressBar + * added ConsoleLogger + * added a question helper + * added a way to set the process name of a command + * added a way to set a default command instead of `ListCommand` + +2.4.0 +----- + + * added a way to force terminal dimensions + * added a convenient method to detect verbosity level + * [BC BREAK] made descriptors use output instead of returning a string + +2.3.0 +----- + + * added multiselect support to the select dialog helper + * added Table Helper for tabular data rendering + * added support for events in `Application` + * added a way to normalize EOLs in `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()` + * added a way to set the progress bar progress via the `setCurrent` method + * added support for multiple InputOption shortcuts, written as `'-a|-b|-c'` + * added two additional verbosity levels, VERBOSITY_VERY_VERBOSE and VERBOSITY_DEBUG + +2.2.0 +----- + + * added support for colorization on Windows via ConEmu + * add a method to Dialog Helper to ask for a question and hide the response + * added support for interactive selections in console (DialogHelper::select()) + * added support for autocompletion as you type in Dialog Helper + +2.1.0 +----- + + * added ConsoleOutputInterface + * added the possibility to disable a command (Command::isEnabled()) + * added suggestions when a command does not exist + * added a --raw option to the list command + * added support for STDERR in the console output class (errors are now sent + to STDERR) + * made the defaults (helper set, commands, input definition) in Application + more easily customizable + * added support for the shell even if readline is not available + * added support for process isolation in Symfony shell via + `--process-isolation` switch + * added support for `--`, which disables options parsing after that point + (tokens will be parsed as arguments) diff --git a/vendor/symfony/console/CI/GithubActionReporter.php b/vendor/symfony/console/CI/GithubActionReporter.php new file mode 100644 index 00000000..a2187329 --- /dev/null +++ b/vendor/symfony/console/CI/GithubActionReporter.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\CI; + +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * Utility class for Github actions. + * + * @author Maxime Steinhausser + */ +class GithubActionReporter +{ + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $output; + /** + * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L80-L85 + */ + private const ESCAPED_DATA = ['%' => '%25', "\r" => '%0D', "\n" => '%0A']; + /** + * @see https://github.com/actions/toolkit/blob/5e5e1b7aacba68a53836a34db4a288c3c1c1585b/packages/core/src/command.ts#L87-L94 + */ + private const ESCAPED_PROPERTIES = ['%' => '%25', "\r" => '%0D', "\n" => '%0A', ':' => '%3A', ',' => '%2C']; + public function __construct(OutputInterface $output) + { + $this->output = $output; + } + public static function isGithubActionEnvironment() : bool + { + return \false !== \getenv('GITHUB_ACTIONS'); + } + /** + * Output an error using the Github annotations format. + * + * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-error-message + */ + public function error(string $message, ?string $file = null, ?int $line = null, ?int $col = null) : void + { + $this->log('error', $message, $file, $line, $col); + } + /** + * Output a warning using the Github annotations format. + * + * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-a-warning-message + */ + public function warning(string $message, ?string $file = null, ?int $line = null, ?int $col = null) : void + { + $this->log('warning', $message, $file, $line, $col); + } + /** + * Output a debug log using the Github annotations format. + * + * @see https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-a-debug-message + */ + public function debug(string $message, ?string $file = null, ?int $line = null, ?int $col = null) : void + { + $this->log('debug', $message, $file, $line, $col); + } + private function log(string $type, string $message, ?string $file = null, ?int $line = null, ?int $col = null) : void + { + // Some values must be encoded. + $message = \strtr($message, self::ESCAPED_DATA); + if (!$file) { + // No file provided, output the message solely: + $this->output->writeln(\sprintf('::%s::%s', $type, $message)); + return; + } + $this->output->writeln(\sprintf('::%s file=%s,line=%s,col=%s::%s', $type, \strtr($file, self::ESCAPED_PROPERTIES), \strtr($line ?? 1, self::ESCAPED_PROPERTIES), \strtr($col ?? 0, self::ESCAPED_PROPERTIES), $message)); + } +} diff --git a/vendor/symfony/console/Color.php b/vendor/symfony/console/Color.php new file mode 100644 index 00000000..55caca28 --- /dev/null +++ b/vendor/symfony/console/Color.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +/** + * @author Fabien Potencier + */ +final class Color +{ + private const COLORS = ['black' => 0, 'red' => 1, 'green' => 2, 'yellow' => 3, 'blue' => 4, 'magenta' => 5, 'cyan' => 6, 'white' => 7, 'default' => 9]; + private const BRIGHT_COLORS = ['gray' => 0, 'bright-red' => 1, 'bright-green' => 2, 'bright-yellow' => 3, 'bright-blue' => 4, 'bright-magenta' => 5, 'bright-cyan' => 6, 'bright-white' => 7]; + private const AVAILABLE_OPTIONS = ['bold' => ['set' => 1, 'unset' => 22], 'underscore' => ['set' => 4, 'unset' => 24], 'blink' => ['set' => 5, 'unset' => 25], 'reverse' => ['set' => 7, 'unset' => 27], 'conceal' => ['set' => 8, 'unset' => 28]]; + /** + * @var string + */ + private $foreground; + /** + * @var string + */ + private $background; + /** + * @var mixed[] + */ + private $options = []; + public function __construct(string $foreground = '', string $background = '', array $options = []) + { + $this->foreground = $this->parseColor($foreground); + $this->background = $this->parseColor($background, \true); + foreach ($options as $option) { + if (!isset(self::AVAILABLE_OPTIONS[$option])) { + throw new InvalidArgumentException(\sprintf('Invalid option specified: "%s". Expected one of (%s).', $option, \implode(', ', \array_keys(self::AVAILABLE_OPTIONS)))); + } + $this->options[$option] = self::AVAILABLE_OPTIONS[$option]; + } + } + public function apply(string $text) : string + { + return $this->set() . $text . $this->unset(); + } + public function set() : string + { + $setCodes = []; + if ('' !== $this->foreground) { + $setCodes[] = $this->foreground; + } + if ('' !== $this->background) { + $setCodes[] = $this->background; + } + foreach ($this->options as $option) { + $setCodes[] = $option['set']; + } + if (0 === \count($setCodes)) { + return ''; + } + return \sprintf("\x1b[%sm", \implode(';', $setCodes)); + } + public function unset() : string + { + $unsetCodes = []; + if ('' !== $this->foreground) { + $unsetCodes[] = 39; + } + if ('' !== $this->background) { + $unsetCodes[] = 49; + } + foreach ($this->options as $option) { + $unsetCodes[] = $option['unset']; + } + if (0 === \count($unsetCodes)) { + return ''; + } + return \sprintf("\x1b[%sm", \implode(';', $unsetCodes)); + } + private function parseColor(string $color, bool $background = \false) : string + { + if ('' === $color) { + return ''; + } + if ('#' === $color[0]) { + return ($background ? '4' : '3') . Terminal::getColorMode()->convertFromHexToAnsiColorCode($color); + } + if (isset(self::COLORS[$color])) { + return ($background ? '4' : '3') . self::COLORS[$color]; + } + if (isset(self::BRIGHT_COLORS[$color])) { + return ($background ? '10' : '9') . self::BRIGHT_COLORS[$color]; + } + throw new InvalidArgumentException(\sprintf('Invalid "%s" color; expected one of (%s).', $color, \implode(', ', \array_merge(\array_keys(self::COLORS), \array_keys(self::BRIGHT_COLORS))))); + } +} diff --git a/vendor/symfony/console/Command/Command.php b/vendor/symfony/console/Command/Command.php new file mode 100644 index 00000000..0f68fb1e --- /dev/null +++ b/vendor/symfony/console/Command/Command.php @@ -0,0 +1,677 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Command; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Attribute\AsCommand; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionInput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\Suggestion; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\ExceptionInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\LogicException; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\HelperInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\HelperSet; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * Base class for all commands. + * + * @author Fabien Potencier + */ +class Command +{ + // see https://tldp.org/LDP/abs/html/exitcodes.html + public const SUCCESS = 0; + public const FAILURE = 1; + public const INVALID = 2; + /** + * @var string|null The default command name + * + * @deprecated since Symfony 6.1, use the AsCommand attribute instead + */ + protected static $defaultName; + /** + * @var string|null The default command description + * + * @deprecated since Symfony 6.1, use the AsCommand attribute instead + */ + protected static $defaultDescription; + /** + * @var \Symfony\Component\Console\Application|null + */ + private $application; + /** + * @var string|null + */ + private $name; + /** + * @var string|null + */ + private $processTitle; + /** + * @var mixed[] + */ + private $aliases = []; + /** + * @var \Symfony\Component\Console\Input\InputDefinition + */ + private $definition; + /** + * @var bool + */ + private $hidden = \false; + /** + * @var string + */ + private $help = ''; + /** + * @var string + */ + private $description = ''; + /** + * @var \Symfony\Component\Console\Input\InputDefinition|null + */ + private $fullDefinition; + /** + * @var bool + */ + private $ignoreValidationErrors = \false; + /** + * @var \Closure|null + */ + private $code; + /** + * @var mixed[] + */ + private $synopsis = []; + /** + * @var mixed[] + */ + private $usages = []; + /** + * @var \Symfony\Component\Console\Helper\HelperSet|null + */ + private $helperSet; + public static function getDefaultName() : ?string + { + $class = static::class; + if ($attribute = \method_exists(new \ReflectionClass($class), 'getAttributes') ? (new \ReflectionClass($class))->getAttributes(AsCommand::class) : []) { + return $attribute[0]->newInstance()->name; + } + $r = new \ReflectionProperty($class, 'defaultName'); + $r->setAccessible(\true); + if ($class !== $r->class || null === static::$defaultName) { + return null; + } + trigger_deprecation('symfony/console', '6.1', 'Relying on the static property "$defaultName" for setting a command name is deprecated. Add the "%s" attribute to the "%s" class instead.', AsCommand::class, static::class); + return static::$defaultName; + } + public static function getDefaultDescription() : ?string + { + $class = static::class; + if ($attribute = \method_exists(new \ReflectionClass($class), 'getAttributes') ? (new \ReflectionClass($class))->getAttributes(AsCommand::class) : []) { + return $attribute[0]->newInstance()->description; + } + $r = new \ReflectionProperty($class, 'defaultDescription'); + $r->setAccessible(\true); + if ($class !== $r->class || null === static::$defaultDescription) { + return null; + } + trigger_deprecation('symfony/console', '6.1', 'Relying on the static property "$defaultDescription" for setting a command description is deprecated. Add the "%s" attribute to the "%s" class instead.', AsCommand::class, static::class); + return static::$defaultDescription; + } + /** + * @param string|null $name The name of the command; passing null means it must be set in configure() + * + * @throws LogicException When the command name is empty + */ + public function __construct(?string $name = null) + { + $this->definition = new InputDefinition(); + if (null === $name && null !== ($name = static::getDefaultName())) { + $aliases = \explode('|', $name); + if ('' === ($name = \array_shift($aliases))) { + $this->setHidden(\true); + $name = \array_shift($aliases); + } + $this->setAliases($aliases); + } + if (null !== $name) { + $this->setName($name); + } + if ('' === $this->description) { + $this->setDescription(static::getDefaultDescription() ?? ''); + } + $this->configure(); + } + /** + * Ignores validation errors. + * + * This is mainly useful for the help command. + * + * @return void + */ + public function ignoreValidationErrors() + { + $this->ignoreValidationErrors = \true; + } + /** + * @return void + */ + public function setApplication(?Application $application = null) + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + $this->application = $application; + if ($application) { + $this->setHelperSet($application->getHelperSet()); + } else { + $this->helperSet = null; + } + $this->fullDefinition = null; + } + /** + * @return void + */ + public function setHelperSet(HelperSet $helperSet) + { + $this->helperSet = $helperSet; + } + /** + * Gets the helper set. + */ + public function getHelperSet() : ?HelperSet + { + return $this->helperSet; + } + /** + * Gets the application instance for this command. + */ + public function getApplication() : ?Application + { + return $this->application; + } + /** + * Checks whether the command is enabled or not in the current environment. + * + * Override this to check for x or y and return false if the command cannot + * run properly under the current conditions. + * + * @return bool + */ + public function isEnabled() + { + return \true; + } + /** + * Configures the current command. + * + * @return void + */ + protected function configure() + { + } + /** + * Executes the current command. + * + * This method is not abstract because you can use this class + * as a concrete class. In this case, instead of defining the + * execute() method, you set the code to execute by passing + * a Closure to the setCode() method. + * + * @return int 0 if everything went fine, or an exit code + * + * @throws LogicException When this abstract method is not implemented + * + * @see setCode() + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + throw new LogicException('You must override the execute() method in the concrete command class.'); + } + /** + * Interacts with the user. + * + * This method is executed before the InputDefinition is validated. + * This means that this is the only place where the command can + * interactively ask for values of missing required arguments. + * + * @return void + */ + protected function interact(InputInterface $input, OutputInterface $output) + { + } + /** + * Initializes the command after the input has been bound and before the input + * is validated. + * + * This is mainly useful when a lot of commands extends one main command + * where some things need to be initialized based on the input arguments and options. + * + * @see InputInterface::bind() + * @see InputInterface::validate() + * + * @return void + */ + protected function initialize(InputInterface $input, OutputInterface $output) + { + } + /** + * Runs the command. + * + * The code to execute is either defined directly with the + * setCode() method or by overriding the execute() method + * in a sub-class. + * + * @return int The command exit code + * + * @throws ExceptionInterface When input binding fails. Bypass this by calling {@link ignoreValidationErrors()}. + * + * @see setCode() + * @see execute() + */ + public function run(InputInterface $input, OutputInterface $output) : int + { + // add the application arguments and options + $this->mergeApplicationDefinition(); + // bind the input against the command specific arguments/options + try { + $input->bind($this->getDefinition()); + } catch (ExceptionInterface $e) { + if (!$this->ignoreValidationErrors) { + throw $e; + } + } + $this->initialize($input, $output); + if (null !== $this->processTitle) { + if (\function_exists('cli_set_process_title')) { + if (!@\cli_set_process_title($this->processTitle)) { + if ('Darwin' === \PHP_OS) { + $output->writeln('Running "cli_set_process_title" as an unprivileged user is not supported on MacOS.', OutputInterface::VERBOSITY_VERY_VERBOSE); + } else { + \cli_set_process_title($this->processTitle); + } + } + } elseif (\function_exists('setproctitle')) { + \setproctitle($this->processTitle); + } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) { + $output->writeln('Install the proctitle PECL to be able to change the process title.'); + } + } + if ($input->isInteractive()) { + $this->interact($input, $output); + } + // The command name argument is often omitted when a command is executed directly with its run() method. + // It would fail the validation if we didn't make sure the command argument is present, + // since it's required by the application. + if ($input->hasArgument('command') && null === $input->getArgument('command')) { + $input->setArgument('command', $this->getName()); + } + $input->validate(); + if ($this->code) { + $statusCode = ($this->code)($input, $output); + } else { + $statusCode = $this->execute($input, $output); + if (!\is_int($statusCode)) { + throw new \TypeError(\sprintf('Return value of "%s::execute()" must be of the type int, "%s" returned.', static::class, \get_debug_type($statusCode))); + } + } + return \is_numeric($statusCode) ? (int) $statusCode : 0; + } + /** + * Adds suggestions to $suggestions for the current completion input (e.g. option or argument). + */ + public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void + { + $definition = $this->getDefinition(); + if (CompletionInput::TYPE_OPTION_VALUE === $input->getCompletionType() && $definition->hasOption($input->getCompletionName())) { + $definition->getOption($input->getCompletionName())->complete($input, $suggestions); + } elseif (CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType() && $definition->hasArgument($input->getCompletionName())) { + $definition->getArgument($input->getCompletionName())->complete($input, $suggestions); + } + } + /** + * Sets the code to execute when running this command. + * + * If this method is used, it overrides the code defined + * in the execute() method. + * + * @param callable $code A callable(InputInterface $input, OutputInterface $output) + * + * @return $this + * + * @throws InvalidArgumentException + * + * @see execute() + */ + public function setCode(callable $code) + { + if ($code instanceof \Closure) { + $r = new \ReflectionFunction($code); + if (null === $r->getClosureThis()) { + \set_error_handler(static function () { + }); + try { + if ($c = \Closure::bind($code, $this)) { + $code = $c; + } + } finally { + \restore_error_handler(); + } + } + } else { + $code = \Closure::fromCallable($code); + } + $this->code = $code; + return $this; + } + /** + * Merges the application definition with the command definition. + * + * This method is not part of public API and should not be used directly. + * + * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments + * + * @internal + */ + public function mergeApplicationDefinition(bool $mergeArgs = \true) : void + { + if (null === $this->application) { + return; + } + $this->fullDefinition = new InputDefinition(); + $this->fullDefinition->setOptions($this->definition->getOptions()); + $this->fullDefinition->addOptions($this->application->getDefinition()->getOptions()); + if ($mergeArgs) { + $this->fullDefinition->setArguments($this->application->getDefinition()->getArguments()); + $this->fullDefinition->addArguments($this->definition->getArguments()); + } else { + $this->fullDefinition->setArguments($this->definition->getArguments()); + } + } + /** + * Sets an array of argument and option instances. + * + * @return $this + * @param mixed[]|\Symfony\Component\Console\Input\InputDefinition $definition + */ + public function setDefinition($definition) + { + if ($definition instanceof InputDefinition) { + $this->definition = $definition; + } else { + $this->definition->setDefinition($definition); + } + $this->fullDefinition = null; + return $this; + } + /** + * Gets the InputDefinition attached to this Command. + */ + public function getDefinition() : InputDefinition + { + return $this->fullDefinition ?? $this->getNativeDefinition(); + } + /** + * Gets the InputDefinition to be used to create representations of this Command. + * + * Can be overridden to provide the original command representation when it would otherwise + * be changed by merging with the application InputDefinition. + * + * This method is not part of public API and should not be used directly. + */ + public function getNativeDefinition() : InputDefinition + { + if (!isset($this->definition)) { + throw new LogicException(\sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', static::class)); + } + return $this->definition; + } + /** + * Adds an argument. + * + * @param $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL + * @param $default The default value (for InputArgument::OPTIONAL mode only) + * @param array|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion + * + * @return $this + * + * @throws InvalidArgumentException When argument mode is not valid + * @param mixed $default + */ + public function addArgument(string $name, ?int $mode = null, string $description = '', $default = null) + { + $suggestedValues = 5 <= \func_num_args() ? \func_get_arg(4) : []; + if (!\is_array($suggestedValues) && !$suggestedValues instanceof \Closure) { + throw new \TypeError(\sprintf('Argument 5 passed to "%s()" must be array or \\Closure, "%s" given.', __METHOD__, \get_debug_type($suggestedValues))); + } + $this->definition->addArgument(new InputArgument($name, $mode, $description, $default, $suggestedValues)); + ($nullsafeVariable1 = $this->fullDefinition) ? $nullsafeVariable1->addArgument(new InputArgument($name, $mode, $description, $default, $suggestedValues)) : null; + return $this; + } + /** + * Adds an option. + * + * @param $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts + * @param $mode The option mode: One of the InputOption::VALUE_* constants + * @param $default The default value (must be null for InputOption::VALUE_NONE) + * @param array|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion + * + * @return $this + * + * @throws InvalidArgumentException If option mode is invalid or incompatible + * @param string|mixed[]|null $shortcut + * @param mixed $default + */ + public function addOption(string $name, $shortcut = null, ?int $mode = null, string $description = '', $default = null) + { + $suggestedValues = 6 <= \func_num_args() ? \func_get_arg(5) : []; + if (!\is_array($suggestedValues) && !$suggestedValues instanceof \Closure) { + throw new \TypeError(\sprintf('Argument 5 passed to "%s()" must be array or \\Closure, "%s" given.', __METHOD__, \get_debug_type($suggestedValues))); + } + $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default, $suggestedValues)); + ($nullsafeVariable2 = $this->fullDefinition) ? $nullsafeVariable2->addOption(new InputOption($name, $shortcut, $mode, $description, $default, $suggestedValues)) : null; + return $this; + } + /** + * Sets the name of the command. + * + * This method can set both the namespace and the name if + * you separate them by a colon (:) + * + * $command->setName('foo:bar'); + * + * @return $this + * + * @throws InvalidArgumentException When the name is invalid + */ + public function setName(string $name) + { + $this->validateName($name); + $this->name = $name; + return $this; + } + /** + * Sets the process title of the command. + * + * This feature should be used only when creating a long process command, + * like a daemon. + * + * @return $this + */ + public function setProcessTitle(string $title) + { + $this->processTitle = $title; + return $this; + } + /** + * Returns the command name. + */ + public function getName() : ?string + { + return $this->name; + } + /** + * @param bool $hidden Whether or not the command should be hidden from the list of commands + * + * @return $this + */ + public function setHidden(bool $hidden = \true) + { + $this->hidden = $hidden; + return $this; + } + /** + * @return bool whether the command should be publicly shown or not + */ + public function isHidden() : bool + { + return $this->hidden; + } + /** + * Sets the description for the command. + * + * @return $this + */ + public function setDescription(string $description) + { + $this->description = $description; + return $this; + } + /** + * Returns the description for the command. + */ + public function getDescription() : string + { + return $this->description; + } + /** + * Sets the help for the command. + * + * @return $this + */ + public function setHelp(string $help) + { + $this->help = $help; + return $this; + } + /** + * Returns the help for the command. + */ + public function getHelp() : string + { + return $this->help; + } + /** + * Returns the processed help for the command replacing the %command.name% and + * %command.full_name% patterns with the real values dynamically. + */ + public function getProcessedHelp() : string + { + $name = $this->name; + $isSingleCommand = ($nullsafeVariable3 = $this->application) ? $nullsafeVariable3->isSingleCommand() : null; + $placeholders = ['%command.name%', '%command.full_name%']; + $replacements = [$name, $isSingleCommand ? $_SERVER['PHP_SELF'] : $_SERVER['PHP_SELF'] . ' ' . $name]; + return \str_replace($placeholders, $replacements, $this->getHelp() ?: $this->getDescription()); + } + /** + * Sets the aliases for the command. + * + * @param string[] $aliases An array of aliases for the command + * + * @return $this + * + * @throws InvalidArgumentException When an alias is invalid + */ + public function setAliases(iterable $aliases) + { + $list = []; + foreach ($aliases as $alias) { + $this->validateName($alias); + $list[] = $alias; + } + $this->aliases = \is_array($aliases) ? $aliases : $list; + return $this; + } + /** + * Returns the aliases for the command. + */ + public function getAliases() : array + { + return $this->aliases; + } + /** + * Returns the synopsis for the command. + * + * @param bool $short Whether to show the short version of the synopsis (with options folded) or not + */ + public function getSynopsis(bool $short = \false) : string + { + $key = $short ? 'short' : 'long'; + if (!isset($this->synopsis[$key])) { + $this->synopsis[$key] = \trim(\sprintf('%s %s', $this->name, $this->definition->getSynopsis($short))); + } + return $this->synopsis[$key]; + } + /** + * Add a command usage example, it'll be prefixed with the command name. + * + * @return $this + */ + public function addUsage(string $usage) + { + if (\strncmp($usage, $this->name, \strlen($this->name)) !== 0) { + $usage = \sprintf('%s %s', $this->name, $usage); + } + $this->usages[] = $usage; + return $this; + } + /** + * Returns alternative usages of the command. + */ + public function getUsages() : array + { + return $this->usages; + } + /** + * Gets a helper instance by name. + * + * @return HelperInterface + * + * @throws LogicException if no HelperSet is defined + * @throws InvalidArgumentException if the helper is not defined + */ + public function getHelper(string $name) + { + if (null === $this->helperSet) { + throw new LogicException(\sprintf('Cannot retrieve helper "%s" because there is no HelperSet defined. Did you forget to add your command to the application or to set the application on the command using the setApplication() method? You can also set the HelperSet directly using the setHelperSet() method.', $name)); + } + return $this->helperSet->get($name); + } + /** + * Validates a command name. + * + * It must be non-empty and parts can optionally be separated by ":". + * + * @throws InvalidArgumentException When the name is invalid + */ + private function validateName(string $name) : void + { + if (!\preg_match('/^[^\\:]++(\\:[^\\:]++)*$/', $name)) { + throw new InvalidArgumentException(\sprintf('Command name "%s" is invalid.', $name)); + } + } +} diff --git a/vendor/symfony/console/Command/CompleteCommand.php b/vendor/symfony/console/Command/CompleteCommand.php new file mode 100644 index 00000000..a49c4968 --- /dev/null +++ b/vendor/symfony/console/Command/CompleteCommand.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Command; + +use RuleDocGenerator202403\Symfony\Component\Console\Attribute\AsCommand; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionInput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\Output\BashCompletionOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\Output\CompletionOutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\Output\FishCompletionOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\Output\ZshCompletionOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\CommandNotFoundException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\ExceptionInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * Responsible for providing the values to the shell completion. + * + * @author Wouter de Jong + */ +final class CompleteCommand extends Command +{ + public const COMPLETION_API_VERSION = '1'; + /** + * @deprecated since Symfony 6.1 + */ + protected static $defaultName = '|_complete'; + /** + * @deprecated since Symfony 6.1 + */ + protected static $defaultDescription = 'Internal command to provide shell completion suggestions'; + /** + * @var mixed[] + */ + private $completionOutputs; + /** + * @var bool + */ + private $isDebug = \false; + /** + * @param array> $completionOutputs A list of additional completion outputs, with shell name as key and FQCN as value + */ + public function __construct(array $completionOutputs = []) + { + // must be set before the parent constructor, as the property value is used in configure() + $this->completionOutputs = $completionOutputs + ['bash' => BashCompletionOutput::class, 'fish' => FishCompletionOutput::class, 'zsh' => ZshCompletionOutput::class]; + parent::__construct(); + } + protected function configure() : void + { + $this->addOption('shell', 's', InputOption::VALUE_REQUIRED, 'The shell type ("' . \implode('", "', \array_keys($this->completionOutputs)) . '")')->addOption('input', 'i', InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'An array of input tokens (e.g. COMP_WORDS or argv)')->addOption('current', 'c', InputOption::VALUE_REQUIRED, 'The index of the "input" array that the cursor is in (e.g. COMP_CWORD)')->addOption('api-version', 'a', InputOption::VALUE_REQUIRED, 'The API version of the completion script')->addOption('symfony', 'S', InputOption::VALUE_REQUIRED, 'deprecated'); + } + protected function initialize(InputInterface $input, OutputInterface $output) : void + { + $this->isDebug = \filter_var(\getenv('SYMFONY_COMPLETION_DEBUG'), \FILTER_VALIDATE_BOOL); + } + protected function execute(InputInterface $input, OutputInterface $output) : int + { + try { + // "symfony" must be kept for compat with the shell scripts generated by Symfony Console 5.4 - 6.1 + $version = $input->getOption('symfony') ? '1' : $input->getOption('api-version'); + if ($version && \version_compare($version, self::COMPLETION_API_VERSION, '<')) { + $message = \sprintf('Completion script version is not supported ("%s" given, ">=%s" required).', $version, self::COMPLETION_API_VERSION); + $this->log($message); + $output->writeln($message . ' Install the Symfony completion script again by using the "completion" command.'); + return 126; + } + $shell = $input->getOption('shell'); + if (!$shell) { + throw new \RuntimeException('The "--shell" option must be set.'); + } + if (!($completionOutput = $this->completionOutputs[$shell] ?? \false)) { + throw new \RuntimeException(\sprintf('Shell completion is not supported for your shell: "%s" (supported: "%s").', $shell, \implode('", "', \array_keys($this->completionOutputs)))); + } + $completionInput = $this->createCompletionInput($input); + $suggestions = new CompletionSuggestions(); + $this->log(['', '' . \date('Y-m-d H:i:s') . '', 'Input: ("|" indicates the cursor position)', ' ' . (string) $completionInput, 'Command:', ' ' . (string) \implode(' ', $_SERVER['argv']), 'Messages:']); + $command = $this->findCommand($completionInput, $output); + if (null === $command) { + $this->log(' No command found, completing using the Application class.'); + $this->getApplication()->complete($completionInput, $suggestions); + } elseif ($completionInput->mustSuggestArgumentValuesFor('command') && $command->getName() !== $completionInput->getCompletionValue() && !\in_array($completionInput->getCompletionValue(), $command->getAliases(), \true)) { + $this->log(' No command found, completing using the Application class.'); + // expand shortcut names ("cache:cl") into their full name ("cache:clear") + $suggestions->suggestValues(\array_filter(\array_merge([$command->getName()], $command->getAliases()))); + } else { + $command->mergeApplicationDefinition(); + $completionInput->bind($command->getDefinition()); + if (CompletionInput::TYPE_OPTION_NAME === $completionInput->getCompletionType()) { + $this->log(' Completing option names for the ' . \get_class($command instanceof LazyCommand ? $command->getCommand() : $command) . ' command.'); + $suggestions->suggestOptions($command->getDefinition()->getOptions()); + } else { + $this->log([' Completing using the ' . \get_class($command instanceof LazyCommand ? $command->getCommand() : $command) . ' class.', ' Completing ' . $completionInput->getCompletionType() . ' for ' . $completionInput->getCompletionName() . '']); + if (null !== ($compval = $completionInput->getCompletionValue())) { + $this->log(' Current value: ' . $compval . ''); + } + $command->complete($completionInput, $suggestions); + } + } + /** @var CompletionOutputInterface $completionOutput */ + $completionOutput = new $completionOutput(); + $this->log('Suggestions:'); + if ($options = $suggestions->getOptionSuggestions()) { + $this->log(' --' . \implode(' --', \array_map(function ($o) { + return $o->getName(); + }, $options))); + } elseif ($values = $suggestions->getValueSuggestions()) { + $this->log(' ' . \implode(' ', $values)); + } else { + $this->log(' No suggestions were provided'); + } + $completionOutput->write($suggestions, $output); + } catch (\Throwable $e) { + $this->log(['Error!', (string) $e]); + if ($output->isDebug()) { + throw $e; + } + return 2; + } + return 0; + } + private function createCompletionInput(InputInterface $input) : CompletionInput + { + $currentIndex = $input->getOption('current'); + if (!$currentIndex || !\ctype_digit($currentIndex)) { + throw new \RuntimeException('The "--current" option must be set and it must be an integer.'); + } + $completionInput = CompletionInput::fromTokens($input->getOption('input'), (int) $currentIndex); + try { + $completionInput->bind($this->getApplication()->getDefinition()); + } catch (ExceptionInterface $exception) { + } + return $completionInput; + } + private function findCommand(CompletionInput $completionInput, OutputInterface $output) : ?Command + { + try { + $inputName = $completionInput->getFirstArgument(); + if (null === $inputName) { + return null; + } + return $this->getApplication()->find($inputName); + } catch (CommandNotFoundException $exception) { + } + return null; + } + private function log($messages) : void + { + if (!$this->isDebug) { + return; + } + $commandName = \basename($_SERVER['argv'][0]); + \file_put_contents(\sys_get_temp_dir() . '/sf_' . $commandName . '.log', \implode(\PHP_EOL, (array) $messages) . \PHP_EOL, \FILE_APPEND); + } +} diff --git a/vendor/symfony/console/Command/DumpCompletionCommand.php b/vendor/symfony/console/Command/DumpCompletionCommand.php new file mode 100644 index 00000000..4082a4b4 --- /dev/null +++ b/vendor/symfony/console/Command/DumpCompletionCommand.php @@ -0,0 +1,143 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Command; + +use RuleDocGenerator202403\Symfony\Component\Console\Attribute\AsCommand; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Process\Process; +/** + * Dumps the completion script for the current shell. + * + * @author Wouter de Jong + */ +final class DumpCompletionCommand extends Command +{ + /** + * @deprecated since Symfony 6.1 + */ + protected static $defaultName = 'completion'; + /** + * @deprecated since Symfony 6.1 + */ + protected static $defaultDescription = 'Dump the shell completion script'; + /** + * @var mixed[] + */ + private $supportedShells; + protected function configure() : void + { + $fullCommand = $_SERVER['PHP_SELF']; + $commandName = \basename($fullCommand); + $fullCommand = @\realpath($fullCommand) ?: $fullCommand; + $shell = $this->guessShell(); + switch ($shell) { + case 'fish': + [$rcFile, $completionFile] = ['~/.config/fish/config.fish', "/etc/fish/completions/{$commandName}.fish"]; + break; + case 'zsh': + [$rcFile, $completionFile] = ['~/.zshrc', '$fpath[1]/_' . $commandName]; + break; + default: + [$rcFile, $completionFile] = ['~/.bashrc', "/etc/bash_completion.d/{$commandName}"]; + break; + } + $supportedShells = \implode(', ', $this->getSupportedShells()); + $this->setHelp(<<%command.name% command dumps the shell completion script required +to use shell autocompletion (currently, {$supportedShells} completion are supported). + +Static installation +------------------- + +Dump the script to a global completion file and restart your shell: + + %command.full_name% {$shell} | sudo tee {$completionFile} + +Or dump the script to a local file and source it: + + %command.full_name% {$shell} > completion.sh + + # source the file whenever you use the project + source completion.sh + + # or add this line at the end of your "{$rcFile}" file: + source /path/to/completion.sh + +Dynamic installation +-------------------- + +Add this to the end of your shell configuration file (e.g. "{$rcFile}"): + + eval "\$({$fullCommand} completion {$shell})" +EOH +)->addArgument('shell', InputArgument::OPTIONAL, 'The shell type (e.g. "bash"), the value of the "$SHELL" env var will be used if this is not given', null, \Closure::fromCallable([$this, 'getSupportedShells']))->addOption('debug', null, InputOption::VALUE_NONE, 'Tail the completion debug log'); + } + protected function execute(InputInterface $input, OutputInterface $output) : int + { + $commandName = \basename($_SERVER['argv'][0]); + if ($input->getOption('debug')) { + $this->tailDebugLog($commandName, $output); + return 0; + } + $shell = $input->getArgument('shell') ?? self::guessShell(); + $completionFile = __DIR__ . '/../Resources/completion.' . $shell; + if (!\file_exists($completionFile)) { + $supportedShells = $this->getSupportedShells(); + if ($output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + if ($shell) { + $output->writeln(\sprintf('Detected shell "%s", which is not supported by Symfony shell completion (supported shells: "%s").', $shell, \implode('", "', $supportedShells))); + } else { + $output->writeln(\sprintf('Shell not detected, Symfony shell completion only supports "%s").', \implode('", "', $supportedShells))); + } + return 2; + } + $output->write(\str_replace(['{{ COMMAND_NAME }}', '{{ VERSION }}'], [$commandName, CompleteCommand::COMPLETION_API_VERSION], \file_get_contents($completionFile))); + return 0; + } + private static function guessShell() : string + { + return \basename($_SERVER['SHELL'] ?? ''); + } + private function tailDebugLog(string $commandName, OutputInterface $output) : void + { + $debugFile = \sys_get_temp_dir() . '/sf_' . $commandName . '.log'; + if (!\file_exists($debugFile)) { + \touch($debugFile); + } + $process = new Process(['tail', '-f', $debugFile], null, null, null, 0); + $process->run(function (string $type, string $line) use($output) : void { + $output->write($line); + }); + } + /** + * @return string[] + */ + private function getSupportedShells() : array + { + if (isset($this->supportedShells)) { + return $this->supportedShells; + } + $shells = []; + foreach (new \DirectoryIterator(__DIR__ . '/../Resources/') as $file) { + if (\strncmp($file->getBasename(), 'completion.', \strlen('completion.')) === 0 && $file->isFile()) { + $shells[] = $file->getExtension(); + } + } + \sort($shells); + return $this->supportedShells = $shells; + } +} diff --git a/vendor/symfony/console/Command/HelpCommand.php b/vendor/symfony/console/Command/HelpCommand.php new file mode 100644 index 00000000..39caf7d3 --- /dev/null +++ b/vendor/symfony/console/Command/HelpCommand.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Command; + +use RuleDocGenerator202403\Symfony\Component\Console\Descriptor\ApplicationDescription; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\DescriptorHelper; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * HelpCommand displays the help for a given command. + * + * @author Fabien Potencier + */ +class HelpCommand extends Command +{ + /** + * @var \Symfony\Component\Console\Command\Command + */ + private $command; + /** + * @return void + */ + protected function configure() + { + $this->ignoreValidationErrors(); + $this->setName('help')->setDefinition([new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help', function () { + return \array_keys((new ApplicationDescription($this->getApplication()))->getCommands()); + }), new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', function () { + return (new DescriptorHelper())->getFormats(); + }), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help')])->setDescription('Display help for a command')->setHelp(<<<'EOF' +The %command.name% command displays help for a given command: + + %command.full_name% list + +You can also output the help in other formats by using the --format option: + + %command.full_name% --format=xml list + +To display the list of available commands, please use the list command. +EOF +); + } + /** + * @return void + */ + public function setCommand(Command $command) + { + $this->command = $command; + } + protected function execute(InputInterface $input, OutputInterface $output) : int + { + $this->command = $this->command ?? $this->getApplication()->find($input->getArgument('command_name')); + $helper = new DescriptorHelper(); + $helper->describe($output, $this->command, ['format' => $input->getOption('format'), 'raw_text' => $input->getOption('raw')]); + unset($this->command); + return 0; + } +} diff --git a/vendor/symfony/console/Command/LazyCommand.php b/vendor/symfony/console/Command/LazyCommand.php new file mode 100644 index 00000000..784c28e0 --- /dev/null +++ b/vendor/symfony/console/Command/LazyCommand.php @@ -0,0 +1,188 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Command; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionInput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\Suggestion; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\HelperInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\HelperSet; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * @author Nicolas Grekas + */ +final class LazyCommand extends Command +{ + /** + * @var \Closure|\Symfony\Component\Console\Command\Command + */ + private $command; + /** + * @var bool|null + */ + private $isEnabled; + public function __construct(string $name, array $aliases, string $description, bool $isHidden, \Closure $commandFactory, ?bool $isEnabled = \true) + { + $this->setName($name)->setAliases($aliases)->setHidden($isHidden)->setDescription($description); + $this->command = $commandFactory; + $this->isEnabled = $isEnabled; + } + public function ignoreValidationErrors() : void + { + $this->getCommand()->ignoreValidationErrors(); + } + public function setApplication(?Application $application = null) : void + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + if ($this->command instanceof parent) { + $this->command->setApplication($application); + } + parent::setApplication($application); + } + public function setHelperSet(HelperSet $helperSet) : void + { + if ($this->command instanceof parent) { + $this->command->setHelperSet($helperSet); + } + parent::setHelperSet($helperSet); + } + public function isEnabled() : bool + { + return $this->isEnabled ?? $this->getCommand()->isEnabled(); + } + public function run(InputInterface $input, OutputInterface $output) : int + { + return $this->getCommand()->run($input, $output); + } + public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void + { + $this->getCommand()->complete($input, $suggestions); + } + /** + * @return static + */ + public function setCode(callable $code) + { + $this->getCommand()->setCode($code); + return $this; + } + /** + * @internal + */ + public function mergeApplicationDefinition(bool $mergeArgs = \true) : void + { + $this->getCommand()->mergeApplicationDefinition($mergeArgs); + } + /** + * @param mixed[]|\Symfony\Component\Console\Input\InputDefinition $definition + * @return static + */ + public function setDefinition($definition) + { + $this->getCommand()->setDefinition($definition); + return $this; + } + public function getDefinition() : InputDefinition + { + return $this->getCommand()->getDefinition(); + } + public function getNativeDefinition() : InputDefinition + { + return $this->getCommand()->getNativeDefinition(); + } + /** + * @param array|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion + * @param mixed $default + * @return static + */ + public function addArgument(string $name, ?int $mode = null, string $description = '', $default = null) + { + $suggestedValues = 5 <= \func_num_args() ? \func_get_arg(4) : []; + $this->getCommand()->addArgument($name, $mode, $description, $default, $suggestedValues); + return $this; + } + /** + * @param array|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion + * @param string|mixed[]|null $shortcut + * @param mixed $default + * @return static + */ + public function addOption(string $name, $shortcut = null, ?int $mode = null, string $description = '', $default = null) + { + $suggestedValues = 6 <= \func_num_args() ? \func_get_arg(5) : []; + $this->getCommand()->addOption($name, $shortcut, $mode, $description, $default, $suggestedValues); + return $this; + } + /** + * @return static + */ + public function setProcessTitle(string $title) + { + $this->getCommand()->setProcessTitle($title); + return $this; + } + /** + * @return static + */ + public function setHelp(string $help) + { + $this->getCommand()->setHelp($help); + return $this; + } + public function getHelp() : string + { + return $this->getCommand()->getHelp(); + } + public function getProcessedHelp() : string + { + return $this->getCommand()->getProcessedHelp(); + } + public function getSynopsis(bool $short = \false) : string + { + return $this->getCommand()->getSynopsis($short); + } + /** + * @return static + */ + public function addUsage(string $usage) + { + $this->getCommand()->addUsage($usage); + return $this; + } + public function getUsages() : array + { + return $this->getCommand()->getUsages(); + } + public function getHelper(string $name) : HelperInterface + { + return $this->getCommand()->getHelper($name); + } + public function getCommand() : parent + { + if (!$this->command instanceof \Closure) { + return $this->command; + } + $command = $this->command = ($this->command)(); + $command->setApplication($this->getApplication()); + if (null !== $this->getHelperSet()) { + $command->setHelperSet($this->getHelperSet()); + } + $command->setName($this->getName())->setAliases($this->getAliases())->setHidden($this->isHidden())->setDescription($this->getDescription()); + // Will throw if the command is not correctly initialized. + $command->getDefinition(); + return $command; + } +} diff --git a/vendor/symfony/console/Command/ListCommand.php b/vendor/symfony/console/Command/ListCommand.php new file mode 100644 index 00000000..5c958f0e --- /dev/null +++ b/vendor/symfony/console/Command/ListCommand.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Command; + +use RuleDocGenerator202403\Symfony\Component\Console\Descriptor\ApplicationDescription; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\DescriptorHelper; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * ListCommand displays the list of all available commands for the application. + * + * @author Fabien Potencier + */ +class ListCommand extends Command +{ + /** + * @return void + */ + protected function configure() + { + $this->setName('list')->setDefinition([new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name', null, function () { + return \array_keys((new ApplicationDescription($this->getApplication()))->getNamespaces()); + }), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', function () { + return (new DescriptorHelper())->getFormats(); + }), new InputOption('short', null, InputOption::VALUE_NONE, 'To skip describing commands\' arguments')])->setDescription('List commands')->setHelp(<<<'EOF' +The %command.name% command lists all commands: + + %command.full_name% + +You can also display the commands for a specific namespace: + + %command.full_name% test + +You can also output the information in other formats by using the --format option: + + %command.full_name% --format=xml + +It's also possible to get raw list of commands (useful for embedding command runner): + + %command.full_name% --raw +EOF +); + } + protected function execute(InputInterface $input, OutputInterface $output) : int + { + $helper = new DescriptorHelper(); + $helper->describe($output, $this->getApplication(), ['format' => $input->getOption('format'), 'raw_text' => $input->getOption('raw'), 'namespace' => $input->getArgument('namespace'), 'short' => $input->getOption('short')]); + return 0; + } +} diff --git a/vendor/symfony/console/Command/LockableTrait.php b/vendor/symfony/console/Command/LockableTrait.php new file mode 100644 index 00000000..ea2becc5 --- /dev/null +++ b/vendor/symfony/console/Command/LockableTrait.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Command; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\LogicException; +use RuleDocGenerator202403\Symfony\Component\Lock\LockFactory; +use RuleDocGenerator202403\Symfony\Component\Lock\LockInterface; +use RuleDocGenerator202403\Symfony\Component\Lock\Store\FlockStore; +use RuleDocGenerator202403\Symfony\Component\Lock\Store\SemaphoreStore; +/** + * Basic lock feature for commands. + * + * @author Geoffrey Brier + */ +trait LockableTrait +{ + /** + * @var \Symfony\Component\Lock\LockInterface|null + */ + private $lock; + /** + * Locks a command. + */ + private function lock(?string $name = null, bool $blocking = \false) : bool + { + if (!\class_exists(SemaphoreStore::class)) { + throw new LogicException('To enable the locking feature you must install the symfony/lock component. Try running "composer require symfony/lock".'); + } + if (null !== $this->lock) { + throw new LogicException('A lock is already in place.'); + } + if (SemaphoreStore::isSupported()) { + $store = new SemaphoreStore(); + } else { + $store = new FlockStore(); + } + $this->lock = (new LockFactory($store))->createLock($name ?: $this->getName()); + if (!$this->lock->acquire($blocking)) { + $this->lock = null; + return \false; + } + return \true; + } + /** + * Releases the command lock if there is one. + */ + private function release() : void + { + if ($this->lock) { + $this->lock->release(); + $this->lock = null; + } + } +} diff --git a/vendor/symfony/console/Command/SignalableCommandInterface.php b/vendor/symfony/console/Command/SignalableCommandInterface.php new file mode 100644 index 00000000..ffcefae9 --- /dev/null +++ b/vendor/symfony/console/Command/SignalableCommandInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Command; + +/** + * Interface for command reacting to signal. + * + * @author Grégoire Pineau + */ +interface SignalableCommandInterface +{ + /** + * Returns the list of signals to subscribe. + */ + public function getSubscribedSignals() : array; + /** + * The method will be called when the application is signaled. + * + * @param int|false $previousExitCode + * + * @return int|false The exit code to return or false to continue the normal execution + */ + public function handleSignal(int $signal); +} diff --git a/vendor/symfony/console/Command/TraceableCommand.php b/vendor/symfony/console/Command/TraceableCommand.php new file mode 100644 index 00000000..2cafb8f0 --- /dev/null +++ b/vendor/symfony/console/Command/TraceableCommand.php @@ -0,0 +1,340 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Command; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionInput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\HelperInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\HelperSet; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Stopwatch\Stopwatch; +/** + * @internal + * + * @author Jules Pietri + */ +final class TraceableCommand extends Command implements SignalableCommandInterface +{ + /** + * @readonly + * @var \Symfony\Component\Stopwatch\Stopwatch + */ + private $stopwatch; + /** + * @readonly + * @var \Symfony\Component\Console\Command\Command + */ + public $command; + /** + * @var int + */ + public $exitCode; + /** + * @var int|null + */ + public $interruptedBySignal; + /** + * @var bool + */ + public $ignoreValidation; + /** + * @var bool + */ + public $isInteractive = \false; + /** + * @var string + */ + public $duration = 'n/a'; + /** + * @var string + */ + public $maxMemoryUsage = 'n/a'; + /** + * @var \Symfony\Component\Console\Input\InputInterface + */ + public $input; + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + public $output; + /** @var array */ + public $arguments; + /** @var array */ + public $options; + /** @var array */ + public $interactiveInputs = []; + /** + * @var mixed[] + */ + public $handledSignals = []; + public function __construct(Command $command, Stopwatch $stopwatch) + { + $this->stopwatch = $stopwatch; + if ($command instanceof LazyCommand) { + $command = $command->getCommand(); + } + $this->command = $command; + // prevent call to self::getDefaultDescription() + $this->setDescription($command->getDescription()); + parent::__construct($command->getName()); + // init below enables calling {@see parent::run()} + [$code, $processTitle, $ignoreValidationErrors] = \Closure::bind(function () { + return [$this->code, $this->processTitle, $this->ignoreValidationErrors]; + }, $command, Command::class)(); + if (\is_callable($code)) { + $this->setCode($code); + } + if ($processTitle) { + parent::setProcessTitle($processTitle); + } + if ($ignoreValidationErrors) { + parent::ignoreValidationErrors(); + } + $this->ignoreValidation = $ignoreValidationErrors; + } + /** + * @return mixed + */ + public function __call(string $name, array $arguments) + { + return $this->command->{$name}(...$arguments); + } + public function getSubscribedSignals() : array + { + return $this->command instanceof SignalableCommandInterface ? $this->command->getSubscribedSignals() : []; + } + /** + * @param int|false $previousExitCode + * @return int|false + */ + public function handleSignal(int $signal, $previousExitCode = 0) + { + if (!$this->command instanceof SignalableCommandInterface) { + return \false; + } + $event = $this->stopwatch->start($this->getName() . '.handle_signal'); + $exit = $this->command->handleSignal($signal, $previousExitCode); + $event->stop(); + if (!isset($this->handledSignals[$signal])) { + $this->handledSignals[$signal] = ['handled' => 0, 'duration' => 0, 'memory' => 0]; + } + ++$this->handledSignals[$signal]['handled']; + $this->handledSignals[$signal]['duration'] += $event->getDuration(); + $this->handledSignals[$signal]['memory'] = \max($this->handledSignals[$signal]['memory'], $event->getMemory() >> 20); + return $exit; + } + /** + * {@inheritdoc} + * + * Calling parent method is required to be used in {@see parent::run()}. + */ + public function ignoreValidationErrors() : void + { + $this->ignoreValidation = \true; + $this->command->ignoreValidationErrors(); + parent::ignoreValidationErrors(); + } + public function setApplication(?Application $application = null) : void + { + $this->command->setApplication($application); + } + public function getApplication() : ?Application + { + return $this->command->getApplication(); + } + public function setHelperSet(HelperSet $helperSet) : void + { + $this->command->setHelperSet($helperSet); + } + public function getHelperSet() : ?HelperSet + { + return $this->command->getHelperSet(); + } + public function isEnabled() : bool + { + return $this->command->isEnabled(); + } + public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void + { + $this->command->complete($input, $suggestions); + } + /** + * {@inheritdoc} + * + * Calling parent method is required to be used in {@see parent::run()}. + * @return static + */ + public function setCode(callable $code) + { + $this->command->setCode($code); + return parent::setCode(function (InputInterface $input, OutputInterface $output) use($code) : int { + $event = $this->stopwatch->start($this->getName() . '.code'); + $this->exitCode = $code($input, $output); + $event->stop(); + return $this->exitCode; + }); + } + /** + * @internal + */ + public function mergeApplicationDefinition(bool $mergeArgs = \true) : void + { + $this->command->mergeApplicationDefinition($mergeArgs); + } + /** + * @param mixed[]|\Symfony\Component\Console\Input\InputDefinition $definition + * @return static + */ + public function setDefinition($definition) + { + $this->command->setDefinition($definition); + return $this; + } + public function getDefinition() : InputDefinition + { + return $this->command->getDefinition(); + } + public function getNativeDefinition() : InputDefinition + { + return $this->command->getNativeDefinition(); + } + /** + * @param mixed[]|\Closure $suggestedValues + * @param mixed $default + * @return static + */ + public function addArgument(string $name, ?int $mode = null, string $description = '', $default = null, $suggestedValues = []) + { + $this->command->addArgument($name, $mode, $description, $default, $suggestedValues); + return $this; + } + /** + * @param string|mixed[]|null $shortcut + * @param mixed[]|\Closure $suggestedValues + * @param mixed $default + * @return static + */ + public function addOption(string $name, $shortcut = null, ?int $mode = null, string $description = '', $default = null, $suggestedValues = []) + { + $this->command->addOption($name, $shortcut, $mode, $description, $default, $suggestedValues); + return $this; + } + /** + * {@inheritdoc} + * + * Calling parent method is required to be used in {@see parent::run()}. + * @return static + */ + public function setProcessTitle(string $title) + { + $this->command->setProcessTitle($title); + return parent::setProcessTitle($title); + } + /** + * @return static + */ + public function setHelp(string $help) + { + $this->command->setHelp($help); + return $this; + } + public function getHelp() : string + { + return $this->command->getHelp(); + } + public function getProcessedHelp() : string + { + return $this->command->getProcessedHelp(); + } + public function getSynopsis(bool $short = \false) : string + { + return $this->command->getSynopsis($short); + } + /** + * @return static + */ + public function addUsage(string $usage) + { + $this->command->addUsage($usage); + return $this; + } + public function getUsages() : array + { + return $this->command->getUsages(); + } + public function getHelper(string $name) : HelperInterface + { + return $this->command->getHelper($name); + } + public function run(InputInterface $input, OutputInterface $output) : int + { + $this->input = $input; + $this->output = $output; + $this->arguments = $input->getArguments(); + $this->options = $input->getOptions(); + $event = $this->stopwatch->start($this->getName(), 'command'); + try { + $this->exitCode = parent::run($input, $output); + } finally { + $event->stop(); + if ($output instanceof ConsoleOutputInterface && $output->isDebug()) { + $output->getErrorOutput()->writeln((string) $event); + } + $this->duration = $event->getDuration() . ' ms'; + $this->maxMemoryUsage = ($event->getMemory() >> 20) . ' MiB'; + if ($this->isInteractive) { + $this->extractInteractiveInputs($input->getArguments(), $input->getOptions()); + } + } + return $this->exitCode; + } + protected function initialize(InputInterface $input, OutputInterface $output) : void + { + $event = $this->stopwatch->start($this->getName() . '.init', 'command'); + $this->command->initialize($input, $output); + $event->stop(); + } + protected function interact(InputInterface $input, OutputInterface $output) : void + { + if (!($this->isInteractive = Command::class !== (new \ReflectionMethod($this->command, 'interact'))->getDeclaringClass()->getName())) { + return; + } + $event = $this->stopwatch->start($this->getName() . '.interact', 'command'); + $this->command->interact($input, $output); + $event->stop(); + } + protected function execute(InputInterface $input, OutputInterface $output) : int + { + $event = $this->stopwatch->start($this->getName() . '.execute', 'command'); + $exitCode = $this->command->execute($input, $output); + $event->stop(); + return $exitCode; + } + private function extractInteractiveInputs(array $arguments, array $options) : void + { + foreach ($arguments as $argName => $argValue) { + if (\array_key_exists($argName, $this->arguments) && $this->arguments[$argName] === $argValue) { + continue; + } + $this->interactiveInputs[$argName] = $argValue; + } + foreach ($options as $optName => $optValue) { + if (\array_key_exists($optName, $this->options) && $this->options[$optName] === $optValue) { + continue; + } + $this->interactiveInputs['--' . $optName] = $optValue; + } + } +} diff --git a/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php b/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php new file mode 100644 index 00000000..8b4cf8c7 --- /dev/null +++ b/vendor/symfony/console/CommandLoader/CommandLoaderInterface.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\CommandLoader; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\CommandNotFoundException; +/** + * @author Robin Chalas + */ +interface CommandLoaderInterface +{ + /** + * Loads a command. + * + * @throws CommandNotFoundException + */ + public function get(string $name) : Command; + /** + * Checks if a command exists. + */ + public function has(string $name) : bool; + /** + * @return string[] + */ + public function getNames() : array; +} diff --git a/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php b/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php new file mode 100644 index 00000000..8c8e5c0d --- /dev/null +++ b/vendor/symfony/console/CommandLoader/ContainerCommandLoader.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\CommandLoader; + +use RuleDocGenerator202403\Psr\Container\ContainerInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\CommandNotFoundException; +/** + * Loads commands from a PSR-11 container. + * + * @author Robin Chalas + */ +class ContainerCommandLoader implements CommandLoaderInterface +{ + /** + * @var \Psr\Container\ContainerInterface + */ + private $container; + /** + * @var mixed[] + */ + private $commandMap; + /** + * @param array $commandMap An array with command names as keys and service ids as values + */ + public function __construct(ContainerInterface $container, array $commandMap) + { + $this->container = $container; + $this->commandMap = $commandMap; + } + public function get(string $name) : Command + { + if (!$this->has($name)) { + throw new CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name)); + } + return $this->container->get($this->commandMap[$name]); + } + public function has(string $name) : bool + { + return isset($this->commandMap[$name]) && $this->container->has($this->commandMap[$name]); + } + public function getNames() : array + { + return \array_keys($this->commandMap); + } +} diff --git a/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php b/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php new file mode 100644 index 00000000..0956c667 --- /dev/null +++ b/vendor/symfony/console/CommandLoader/FactoryCommandLoader.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\CommandLoader; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\CommandNotFoundException; +/** + * A simple command loader using factories to instantiate commands lazily. + * + * @author Maxime Steinhausser + */ +class FactoryCommandLoader implements CommandLoaderInterface +{ + /** + * @var mixed[] + */ + private $factories; + /** + * @param callable[] $factories Indexed by command names + */ + public function __construct(array $factories) + { + $this->factories = $factories; + } + public function has(string $name) : bool + { + return isset($this->factories[$name]); + } + public function get(string $name) : Command + { + if (!isset($this->factories[$name])) { + throw new CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name)); + } + $factory = $this->factories[$name]; + return $factory(); + } + public function getNames() : array + { + return \array_keys($this->factories); + } +} diff --git a/vendor/symfony/console/Completion/CompletionInput.php b/vendor/symfony/console/Completion/CompletionInput.php new file mode 100644 index 00000000..736c1be8 --- /dev/null +++ b/vendor/symfony/console/Completion/CompletionInput.php @@ -0,0 +1,228 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Completion; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RuntimeException; +use RuleDocGenerator202403\Symfony\Component\Console\Input\ArgvInput; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +/** + * An input specialized for shell completion. + * + * This input allows unfinished option names or values and exposes what kind of + * completion is expected. + * + * @author Wouter de Jong + */ +final class CompletionInput extends ArgvInput +{ + public const TYPE_ARGUMENT_VALUE = 'argument_value'; + public const TYPE_OPTION_VALUE = 'option_value'; + public const TYPE_OPTION_NAME = 'option_name'; + public const TYPE_NONE = 'none'; + /** + * @var mixed[] + */ + private $tokens; + /** + * @var int + */ + private $currentIndex; + /** + * @var string + */ + private $completionType; + /** + * @var string|null + */ + private $completionName; + /** + * @var string + */ + private $completionValue = ''; + /** + * Converts a terminal string into tokens. + * + * This is required for shell completions without COMP_WORDS support. + */ + public static function fromString(string $inputStr, int $currentIndex) : self + { + \preg_match_all('/(?<=^|\\s)([\'"]?)(.+?)(?tokens = $tokens; + $input->currentIndex = $currentIndex; + return $input; + } + public function bind(InputDefinition $definition) : void + { + parent::bind($definition); + $relevantToken = $this->getRelevantToken(); + if ('-' === $relevantToken[0]) { + // the current token is an input option: complete either option name or option value + [$optionToken, $optionValue] = \explode('=', $relevantToken, 2) + ['', '']; + $option = $this->getOptionFromToken($optionToken); + if (null === $option && !$this->isCursorFree()) { + $this->completionType = self::TYPE_OPTION_NAME; + $this->completionValue = $relevantToken; + return; + } + if (($nullsafeVariable1 = $option) ? $nullsafeVariable1->acceptValue() : null) { + $this->completionType = self::TYPE_OPTION_VALUE; + $this->completionName = $option->getName(); + $this->completionValue = $optionValue ?: (\strncmp($optionToken, '--', \strlen('--')) !== 0 ? \substr($optionToken, 2) : ''); + return; + } + } + $previousToken = $this->tokens[$this->currentIndex - 1]; + if ('-' === $previousToken[0] && '' !== \trim($previousToken, '-')) { + // check if previous option accepted a value + $previousOption = $this->getOptionFromToken($previousToken); + if (($nullsafeVariable2 = $previousOption) ? $nullsafeVariable2->acceptValue() : null) { + $this->completionType = self::TYPE_OPTION_VALUE; + $this->completionName = $previousOption->getName(); + $this->completionValue = $relevantToken; + return; + } + } + // complete argument value + $this->completionType = self::TYPE_ARGUMENT_VALUE; + foreach ($this->definition->getArguments() as $argumentName => $argument) { + if (!isset($this->arguments[$argumentName])) { + break; + } + $argumentValue = $this->arguments[$argumentName]; + $this->completionName = $argumentName; + if (\is_array($argumentValue)) { + \end($argumentValue); + $this->completionValue = $argumentValue ? $argumentValue[\key($argumentValue)] : null; + \reset($argumentValue); + } else { + $this->completionValue = $argumentValue; + } + } + if ($this->currentIndex >= \count($this->tokens)) { + if (!isset($this->arguments[$argumentName]) || $this->definition->getArgument($argumentName)->isArray()) { + $this->completionName = $argumentName; + $this->completionValue = ''; + } else { + // we've reached the end + $this->completionType = self::TYPE_NONE; + $this->completionName = null; + $this->completionValue = ''; + } + } + } + /** + * Returns the type of completion required. + * + * TYPE_ARGUMENT_VALUE when completing the value of an input argument + * TYPE_OPTION_VALUE when completing the value of an input option + * TYPE_OPTION_NAME when completing the name of an input option + * TYPE_NONE when nothing should be completed + * + * TYPE_OPTION_NAME and TYPE_NONE are already implemented by the Console component. + * + * @return self::TYPE_* + */ + public function getCompletionType() : string + { + return $this->completionType; + } + /** + * The name of the input option or argument when completing a value. + * + * @return string|null returns null when completing an option name + */ + public function getCompletionName() : ?string + { + return $this->completionName; + } + /** + * The value already typed by the user (or empty string). + */ + public function getCompletionValue() : string + { + return $this->completionValue; + } + public function mustSuggestOptionValuesFor(string $optionName) : bool + { + return self::TYPE_OPTION_VALUE === $this->getCompletionType() && $optionName === $this->getCompletionName(); + } + public function mustSuggestArgumentValuesFor(string $argumentName) : bool + { + return self::TYPE_ARGUMENT_VALUE === $this->getCompletionType() && $argumentName === $this->getCompletionName(); + } + protected function parseToken(string $token, bool $parseOptions) : bool + { + try { + return parent::parseToken($token, $parseOptions); + } catch (RuntimeException $exception) { + // suppress errors, completed input is almost never valid + } + return $parseOptions; + } + private function getOptionFromToken(string $optionToken) : ?InputOption + { + $optionName = \ltrim($optionToken, '-'); + if (!$optionName) { + return null; + } + if ('-' === ($optionToken[1] ?? ' ')) { + // long option name + return $this->definition->hasOption($optionName) ? $this->definition->getOption($optionName) : null; + } + // short option name + return $this->definition->hasShortcut($optionName[0]) ? $this->definition->getOptionForShortcut($optionName[0]) : null; + } + /** + * The token of the cursor, or the last token if the cursor is at the end of the input. + */ + private function getRelevantToken() : string + { + return $this->tokens[$this->isCursorFree() ? $this->currentIndex - 1 : $this->currentIndex]; + } + /** + * Whether the cursor is "free" (i.e. at the end of the input preceded by a space). + */ + private function isCursorFree() : bool + { + $nrOfTokens = \count($this->tokens); + if ($this->currentIndex > $nrOfTokens) { + throw new \LogicException('Current index is invalid, it must be the number of input tokens or one more.'); + } + return $this->currentIndex >= $nrOfTokens; + } + public function __toString() : string + { + $str = ''; + foreach ($this->tokens as $i => $token) { + $str .= $token; + if ($this->currentIndex === $i) { + $str .= '|'; + } + $str .= ' '; + } + if ($this->currentIndex > $i) { + $str .= '|'; + } + return \rtrim($str); + } +} diff --git a/vendor/symfony/console/Completion/CompletionSuggestions.php b/vendor/symfony/console/Completion/CompletionSuggestions.php new file mode 100644 index 00000000..26493fd0 --- /dev/null +++ b/vendor/symfony/console/Completion/CompletionSuggestions.php @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Completion; + +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +/** + * Stores all completion suggestions for the current input. + * + * @author Wouter de Jong + */ +final class CompletionSuggestions +{ + /** + * @var mixed[] + */ + private $valueSuggestions = []; + /** + * @var mixed[] + */ + private $optionSuggestions = []; + /** + * Add a suggested value for an input option or argument. + * + * @return $this + * @param string|\Symfony\Component\Console\Completion\Suggestion $value + */ + public function suggestValue($value) + { + $this->valueSuggestions[] = !$value instanceof Suggestion ? new Suggestion($value) : $value; + return $this; + } + /** + * Add multiple suggested values at once for an input option or argument. + * + * @param list $values + * + * @return $this + */ + public function suggestValues(array $values) + { + foreach ($values as $value) { + $this->suggestValue($value); + } + return $this; + } + /** + * Add a suggestion for an input option name. + * + * @return $this + */ + public function suggestOption(InputOption $option) + { + $this->optionSuggestions[] = $option; + return $this; + } + /** + * Add multiple suggestions for input option names at once. + * + * @param InputOption[] $options + * + * @return $this + */ + public function suggestOptions(array $options) + { + foreach ($options as $option) { + $this->suggestOption($option); + } + return $this; + } + /** + * @return InputOption[] + */ + public function getOptionSuggestions() : array + { + return $this->optionSuggestions; + } + /** + * @return Suggestion[] + */ + public function getValueSuggestions() : array + { + return $this->valueSuggestions; + } +} diff --git a/vendor/symfony/console/Completion/Output/BashCompletionOutput.php b/vendor/symfony/console/Completion/Output/BashCompletionOutput.php new file mode 100644 index 00000000..2a6c62cb --- /dev/null +++ b/vendor/symfony/console/Completion/Output/BashCompletionOutput.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Completion\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * @author Wouter de Jong + */ +class BashCompletionOutput implements CompletionOutputInterface +{ + public function write(CompletionSuggestions $suggestions, OutputInterface $output) : void + { + $values = $suggestions->getValueSuggestions(); + foreach ($suggestions->getOptionSuggestions() as $option) { + $values[] = '--' . $option->getName(); + if ($option->isNegatable()) { + $values[] = '--no-' . $option->getName(); + } + } + $output->writeln(\implode("\n", $values)); + } +} diff --git a/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php b/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php new file mode 100644 index 00000000..9297e267 --- /dev/null +++ b/vendor/symfony/console/Completion/Output/CompletionOutputInterface.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Completion\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * Transforms the {@see CompletionSuggestions} object into output readable by the shell completion. + * + * @author Wouter de Jong + */ +interface CompletionOutputInterface +{ + public function write(CompletionSuggestions $suggestions, OutputInterface $output) : void; +} diff --git a/vendor/symfony/console/Completion/Output/FishCompletionOutput.php b/vendor/symfony/console/Completion/Output/FishCompletionOutput.php new file mode 100644 index 00000000..a53ad5c2 --- /dev/null +++ b/vendor/symfony/console/Completion/Output/FishCompletionOutput.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Completion\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * @author Guillaume Aveline + */ +class FishCompletionOutput implements CompletionOutputInterface +{ + public function write(CompletionSuggestions $suggestions, OutputInterface $output) : void + { + $values = $suggestions->getValueSuggestions(); + foreach ($suggestions->getOptionSuggestions() as $option) { + $values[] = '--' . $option->getName(); + if ($option->isNegatable()) { + $values[] = '--no-' . $option->getName(); + } + } + $output->write(\implode("\n", $values)); + } +} diff --git a/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php b/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php new file mode 100644 index 00000000..644eb5ef --- /dev/null +++ b/vendor/symfony/console/Completion/Output/ZshCompletionOutput.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Completion\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * @author Jitendra A + */ +class ZshCompletionOutput implements CompletionOutputInterface +{ + public function write(CompletionSuggestions $suggestions, OutputInterface $output) : void + { + $values = []; + foreach ($suggestions->getValueSuggestions() as $value) { + $values[] = $value->getValue() . ($value->getDescription() ? "\t" . $value->getDescription() : ''); + } + foreach ($suggestions->getOptionSuggestions() as $option) { + $values[] = '--' . $option->getName() . ($option->getDescription() ? "\t" . $option->getDescription() : ''); + if ($option->isNegatable()) { + $values[] = '--no-' . $option->getName() . ($option->getDescription() ? "\t" . $option->getDescription() : ''); + } + } + $output->write(\implode("\n", $values) . "\n"); + } +} diff --git a/vendor/symfony/console/Completion/Suggestion.php b/vendor/symfony/console/Completion/Suggestion.php new file mode 100644 index 00000000..90835809 --- /dev/null +++ b/vendor/symfony/console/Completion/Suggestion.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Completion; + +/** + * Represents a single suggested value. + * + * @author Wouter de Jong + */ +class Suggestion +{ + /** + * @readonly + * @var string + */ + private $value; + /** + * @readonly + * @var string + */ + private $description = ''; + public function __construct(string $value, string $description = '') + { + $this->value = $value; + $this->description = $description; + } + public function getValue() : string + { + return $this->value; + } + public function getDescription() : string + { + return $this->description; + } + public function __toString() : string + { + return $this->getValue(); + } +} diff --git a/vendor/symfony/console/ConsoleEvents.php b/vendor/symfony/console/ConsoleEvents.php new file mode 100644 index 00000000..e4e59f5e --- /dev/null +++ b/vendor/symfony/console/ConsoleEvents.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console; + +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleCommandEvent; +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleErrorEvent; +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleSignalEvent; +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleTerminateEvent; +/** + * Contains all events dispatched by an Application. + * + * @author Francesco Levorato + */ +final class ConsoleEvents +{ + /** + * The COMMAND event allows you to attach listeners before any command is + * executed by the console. It also allows you to modify the command, input and output + * before they are handed to the command. + * + * @Event("Symfony\Component\Console\Event\ConsoleCommandEvent") + */ + public const COMMAND = 'console.command'; + /** + * The SIGNAL event allows you to perform some actions + * after the command execution was interrupted. + * + * @Event("Symfony\Component\Console\Event\ConsoleSignalEvent") + */ + public const SIGNAL = 'console.signal'; + /** + * The TERMINATE event allows you to attach listeners after a command is + * executed by the console. + * + * @Event("Symfony\Component\Console\Event\ConsoleTerminateEvent") + */ + public const TERMINATE = 'console.terminate'; + /** + * The ERROR event occurs when an uncaught exception or error appears. + * + * This event allows you to deal with the exception/error or + * to modify the thrown exception. + * + * @Event("Symfony\Component\Console\Event\ConsoleErrorEvent") + */ + public const ERROR = 'console.error'; + /** + * Event aliases. + * + * These aliases can be consumed by RegisterListenersPass. + */ + public const ALIASES = [ConsoleCommandEvent::class => self::COMMAND, ConsoleErrorEvent::class => self::ERROR, ConsoleSignalEvent::class => self::SIGNAL, ConsoleTerminateEvent::class => self::TERMINATE]; +} diff --git a/vendor/symfony/console/Cursor.php b/vendor/symfony/console/Cursor.php new file mode 100644 index 00000000..68f5ed08 --- /dev/null +++ b/vendor/symfony/console/Cursor.php @@ -0,0 +1,168 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console; + +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * @author Pierre du Plessis + */ +final class Cursor +{ + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $output; + /** @var resource */ + private $input; + /** + * @param resource|null $input + */ + public function __construct(OutputInterface $output, $input = null) + { + $this->output = $output; + $this->input = $input ?? (\defined('STDIN') ? \STDIN : \fopen('php://input', 'r+')); + } + /** + * @return $this + */ + public function moveUp(int $lines = 1) + { + $this->output->write(\sprintf("\x1b[%dA", $lines)); + return $this; + } + /** + * @return $this + */ + public function moveDown(int $lines = 1) + { + $this->output->write(\sprintf("\x1b[%dB", $lines)); + return $this; + } + /** + * @return $this + */ + public function moveRight(int $columns = 1) + { + $this->output->write(\sprintf("\x1b[%dC", $columns)); + return $this; + } + /** + * @return $this + */ + public function moveLeft(int $columns = 1) + { + $this->output->write(\sprintf("\x1b[%dD", $columns)); + return $this; + } + /** + * @return $this + */ + public function moveToColumn(int $column) + { + $this->output->write(\sprintf("\x1b[%dG", $column)); + return $this; + } + /** + * @return $this + */ + public function moveToPosition(int $column, int $row) + { + $this->output->write(\sprintf("\x1b[%d;%dH", $row + 1, $column)); + return $this; + } + /** + * @return $this + */ + public function savePosition() + { + $this->output->write("\x1b7"); + return $this; + } + /** + * @return $this + */ + public function restorePosition() + { + $this->output->write("\x1b8"); + return $this; + } + /** + * @return $this + */ + public function hide() + { + $this->output->write("\x1b[?25l"); + return $this; + } + /** + * @return $this + */ + public function show() + { + $this->output->write("\x1b[?25h\x1b[?0c"); + return $this; + } + /** + * Clears all the output from the current line. + * + * @return $this + */ + public function clearLine() + { + $this->output->write("\x1b[2K"); + return $this; + } + /** + * Clears all the output from the current line after the current position. + */ + public function clearLineAfter() : self + { + $this->output->write("\x1b[K"); + return $this; + } + /** + * Clears all the output from the cursors' current position to the end of the screen. + * + * @return $this + */ + public function clearOutput() + { + $this->output->write("\x1b[0J"); + return $this; + } + /** + * Clears the entire screen. + * + * @return $this + */ + public function clearScreen() + { + $this->output->write("\x1b[2J"); + return $this; + } + /** + * Returns the current cursor position as x,y coordinates. + */ + public function getCurrentPosition() : array + { + static $isTtySupported; + if (!($isTtySupported = $isTtySupported ?? '/' === \DIRECTORY_SEPARATOR && \stream_isatty(\STDOUT))) { + return [1, 1]; + } + $sttyMode = \shell_exec('stty -g'); + \shell_exec('stty -icanon -echo'); + @\fwrite($this->input, "\x1b[6n"); + $code = \trim(\fread($this->input, 1024)); + \shell_exec(\sprintf('stty %s', $sttyMode)); + \sscanf($code, "\x1b[%d;%dR", $row, $col); + return [$col, $row]; + } +} diff --git a/vendor/symfony/console/DataCollector/CommandDataCollector.php b/vendor/symfony/console/DataCollector/CommandDataCollector.php new file mode 100644 index 00000000..016c9246 --- /dev/null +++ b/vendor/symfony/console/DataCollector/CommandDataCollector.php @@ -0,0 +1,182 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\DataCollector; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Debug\CliRequest; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\SignalRegistry\SignalMap; +use RuleDocGenerator202403\Symfony\Component\HttpFoundation\Request; +use RuleDocGenerator202403\Symfony\Component\HttpFoundation\Response; +use RuleDocGenerator202403\Symfony\Component\HttpKernel\DataCollector\DataCollector; +use RuleDocGenerator202403\Symfony\Component\VarDumper\Cloner\Data; +/** + * @internal + * + * @author Jules Pietri + */ +final class CommandDataCollector extends DataCollector +{ + public function collect(Request $request, Response $response, ?\Throwable $exception = null) : void + { + if (!$request instanceof CliRequest) { + return; + } + $command = $request->command; + $application = $command->getApplication(); + $this->data = ['command' => $this->cloneVar($command->command), 'exit_code' => $command->exitCode, 'interrupted_by_signal' => $command->interruptedBySignal, 'duration' => $command->duration, 'max_memory_usage' => $command->maxMemoryUsage, 'verbosity_level' => (function () use($command) { + switch ($command->output->getVerbosity()) { + case OutputInterface::VERBOSITY_QUIET: + return 'quiet'; + case OutputInterface::VERBOSITY_NORMAL: + return 'normal'; + case OutputInterface::VERBOSITY_VERBOSE: + return 'verbose'; + case OutputInterface::VERBOSITY_VERY_VERBOSE: + return 'very verbose'; + case OutputInterface::VERBOSITY_DEBUG: + return 'debug'; + } + })(), 'interactive' => $command->isInteractive, 'validate_input' => !$command->ignoreValidation, 'enabled' => $command->isEnabled(), 'visible' => !$command->isHidden(), 'input' => $this->cloneVar($command->input), 'output' => $this->cloneVar($command->output), 'interactive_inputs' => \array_map(\Closure::fromCallable([$this, 'cloneVar']), $command->interactiveInputs), 'signalable' => $command->getSubscribedSignals(), 'handled_signals' => $command->handledSignals, 'helper_set' => \array_map(\Closure::fromCallable([$this, 'cloneVar']), \iterator_to_array($command->getHelperSet()))]; + $baseDefinition = $application->getDefinition(); + foreach ($command->arguments as $argName => $argValue) { + if ($baseDefinition->hasArgument($argName)) { + $this->data['application_inputs'][$argName] = $this->cloneVar($argValue); + } else { + $this->data['arguments'][$argName] = $this->cloneVar($argValue); + } + } + foreach ($command->options as $optName => $optValue) { + if ($baseDefinition->hasOption($optName)) { + $this->data['application_inputs']['--' . $optName] = $this->cloneVar($optValue); + } else { + $this->data['options'][$optName] = $this->cloneVar($optValue); + } + } + } + public function getName() : string + { + return 'command'; + } + /** + * @return array{ + * class?: class-string, + * executor?: string, + * file: string, + * line: int, + * } + */ + public function getCommand() : array + { + $class = $this->data['command']->getType(); + $r = new \ReflectionMethod($class, 'execute'); + if (Command::class !== $r->getDeclaringClass()) { + return ['executor' => $class . '::' . $r->name, 'file' => $r->getFileName(), 'line' => $r->getStartLine()]; + } + $r = new \ReflectionClass($class); + return ['class' => $class, 'file' => $r->getFileName(), 'line' => $r->getStartLine()]; + } + public function getInterruptedBySignal() : ?string + { + if (isset($this->data['interrupted_by_signal'])) { + return \sprintf('%s (%d)', SignalMap::getSignalName($this->data['interrupted_by_signal']), $this->data['interrupted_by_signal']); + } + return null; + } + public function getDuration() : string + { + return $this->data['duration']; + } + public function getMaxMemoryUsage() : string + { + return $this->data['max_memory_usage']; + } + public function getVerbosityLevel() : string + { + return $this->data['verbosity_level']; + } + public function getInteractive() : bool + { + return $this->data['interactive']; + } + public function getValidateInput() : bool + { + return $this->data['validate_input']; + } + public function getEnabled() : bool + { + return $this->data['enabled']; + } + public function getVisible() : bool + { + return $this->data['visible']; + } + public function getInput() : Data + { + return $this->data['input']; + } + public function getOutput() : Data + { + return $this->data['output']; + } + /** + * @return Data[] + */ + public function getArguments() : array + { + return $this->data['arguments'] ?? []; + } + /** + * @return Data[] + */ + public function getOptions() : array + { + return $this->data['options'] ?? []; + } + /** + * @return Data[] + */ + public function getApplicationInputs() : array + { + return $this->data['application_inputs'] ?? []; + } + /** + * @return Data[] + */ + public function getInteractiveInputs() : array + { + return $this->data['interactive_inputs'] ?? []; + } + public function getSignalable() : array + { + return \array_map(static function (int $signal) : string { + return \sprintf('%s (%d)', SignalMap::getSignalName($signal), $signal); + }, $this->data['signalable']); + } + public function getHandledSignals() : array + { + $keys = \array_map(static function (int $signal) : string { + return \sprintf('%s (%d)', SignalMap::getSignalName($signal), $signal); + }, \array_keys($this->data['handled_signals'])); + return \array_combine($keys, \array_values($this->data['handled_signals'])); + } + /** + * @return Data[] + */ + public function getHelperSet() : array + { + return $this->data['helper_set'] ?? []; + } + public function reset() : void + { + $this->data = []; + } +} diff --git a/vendor/symfony/console/Debug/CliRequest.php b/vendor/symfony/console/Debug/CliRequest.php new file mode 100644 index 00000000..db5813e2 --- /dev/null +++ b/vendor/symfony/console/Debug/CliRequest.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Debug; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\TraceableCommand; +use RuleDocGenerator202403\Symfony\Component\HttpFoundation\Request; +use RuleDocGenerator202403\Symfony\Component\HttpFoundation\Response; +/** + * @internal + */ +final class CliRequest extends Request +{ + /** + * @readonly + * @var \Symfony\Component\Console\Command\TraceableCommand + */ + public $command; + public function __construct(TraceableCommand $command) + { + $this->command = $command; + parent::__construct(attributes: ['_controller' => \get_class($command->command), '_virtual_type' => 'command'], server: $_SERVER); + } + // Methods below allow to populate a profile, thus enable search and filtering + public function getUri() : string + { + if ($this->server->has('SYMFONY_CLI_BINARY_NAME')) { + $binary = $this->server->get('SYMFONY_CLI_BINARY_NAME') . ' console'; + } else { + $binary = $this->server->get('argv')[0]; + } + return $binary . ' ' . $this->command->input; + } + public function getMethod() : string + { + return $this->command->isInteractive ? 'INTERACTIVE' : 'BATCH'; + } + public function getResponse() : Response + { + return new class($this->command->exitCode) extends Response + { + /** + * @readonly + * @var int + */ + private $exitCode; + public function __construct(int $exitCode) + { + $this->exitCode = $exitCode; + parent::__construct(); + } + public function getStatusCode() : int + { + return $this->exitCode; + } + }; + } + public function getClientIp() : string + { + $application = $this->command->getApplication(); + return $application->getName() . ' ' . $application->getVersion(); + } +} diff --git a/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php b/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php new file mode 100644 index 00000000..534523cb --- /dev/null +++ b/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\DependencyInjection; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Command\LazyCommand; +use RuleDocGenerator202403\Symfony\Component\Console\CommandLoader\ContainerCommandLoader; +use RuleDocGenerator202403\Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; +use RuleDocGenerator202403\Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use RuleDocGenerator202403\Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass; +use RuleDocGenerator202403\Symfony\Component\DependencyInjection\ContainerBuilder; +use RuleDocGenerator202403\Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\DependencyInjection\Reference; +use RuleDocGenerator202403\Symfony\Component\DependencyInjection\TypedReference; +/** + * Registers console commands. + * + * @author Grégoire Pineau + */ +class AddConsoleCommandPass implements CompilerPassInterface +{ + /** + * @return void + */ + public function process(ContainerBuilder $container) + { + $commandServices = $container->findTaggedServiceIds('console.command', \true); + $lazyCommandMap = []; + $lazyCommandRefs = []; + $serviceIds = []; + foreach ($commandServices as $id => $tags) { + $definition = $container->getDefinition($id); + $definition->addTag('container.no_preload'); + $class = $container->getParameterBag()->resolveValue($definition->getClass()); + if (isset($tags[0]['command'])) { + $aliases = $tags[0]['command']; + } else { + if (!($r = $container->getReflectionClass($class))) { + throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); + } + if (!$r->isSubclassOf(Command::class)) { + throw new InvalidArgumentException(\sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, 'console.command', Command::class)); + } + $aliases = \str_replace('%', '%%', $class::getDefaultName() ?? ''); + } + $aliases = \explode('|', $aliases ?? ''); + $commandName = \array_shift($aliases); + if ($isHidden = '' === $commandName) { + $commandName = \array_shift($aliases); + } + if (null === $commandName) { + if (!$definition->isPublic() || $definition->isPrivate() || $definition->hasTag('container.private')) { + $commandId = 'console.command.public_alias.' . $id; + $container->setAlias($commandId, $id)->setPublic(\true); + $id = $commandId; + } + $serviceIds[] = $id; + continue; + } + $description = $tags[0]['description'] ?? null; + unset($tags[0]); + $lazyCommandMap[$commandName] = $id; + $lazyCommandRefs[$id] = new TypedReference($id, $class); + foreach ($aliases as $alias) { + $lazyCommandMap[$alias] = $id; + } + foreach ($tags as $tag) { + if (isset($tag['command'])) { + $aliases[] = $tag['command']; + $lazyCommandMap[$tag['command']] = $id; + } + $description = $description ?? $tag['description'] ?? null; + } + $definition->addMethodCall('setName', [$commandName]); + if ($aliases) { + $definition->addMethodCall('setAliases', [$aliases]); + } + if ($isHidden) { + $definition->addMethodCall('setHidden', [\true]); + } + if (!$description) { + if (!($r = $container->getReflectionClass($class))) { + throw new InvalidArgumentException(\sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); + } + if (!$r->isSubclassOf(Command::class)) { + throw new InvalidArgumentException(\sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, 'console.command', Command::class)); + } + $description = \str_replace('%', '%%', $class::getDefaultDescription() ?? ''); + } + if ($description) { + $definition->addMethodCall('setDescription', [$description]); + $container->register('.' . $id . '.lazy', LazyCommand::class)->setArguments([$commandName, $aliases, $description, $isHidden, new ServiceClosureArgument($lazyCommandRefs[$id])]); + $lazyCommandRefs[$id] = new Reference('.' . $id . '.lazy'); + } + } + $container->register('console.command_loader', ContainerCommandLoader::class)->setPublic(\true)->addTag('container.no_preload')->setArguments([ServiceLocatorTagPass::register($container, $lazyCommandRefs), $lazyCommandMap]); + $container->setParameter('console.command.ids', $serviceIds); + } +} diff --git a/vendor/symfony/console/Descriptor/ApplicationDescription.php b/vendor/symfony/console/Descriptor/ApplicationDescription.php new file mode 100644 index 00000000..4c0041e2 --- /dev/null +++ b/vendor/symfony/console/Descriptor/ApplicationDescription.php @@ -0,0 +1,129 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Descriptor; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\CommandNotFoundException; +/** + * @author Jean-François Simon + * + * @internal + */ +class ApplicationDescription +{ + public const GLOBAL_NAMESPACE = '_global'; + /** + * @var \Symfony\Component\Console\Application + */ + private $application; + /** + * @var string|null + */ + private $namespace; + /** + * @var bool + */ + private $showHidden; + /** + * @var mixed[] + */ + private $namespaces; + /** + * @var array + */ + private $commands; + /** + * @var array + */ + private $aliases = []; + public function __construct(Application $application, ?string $namespace = null, bool $showHidden = \false) + { + $this->application = $application; + $this->namespace = $namespace; + $this->showHidden = $showHidden; + } + public function getNamespaces() : array + { + if (!isset($this->namespaces)) { + $this->inspectApplication(); + } + return $this->namespaces; + } + /** + * @return Command[] + */ + public function getCommands() : array + { + if (!isset($this->commands)) { + $this->inspectApplication(); + } + return $this->commands; + } + /** + * @throws CommandNotFoundException + */ + public function getCommand(string $name) : Command + { + if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) { + throw new CommandNotFoundException(\sprintf('Command "%s" does not exist.', $name)); + } + return $this->commands[$name] ?? $this->aliases[$name]; + } + private function inspectApplication() : void + { + $this->commands = []; + $this->namespaces = []; + $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null); + foreach ($this->sortCommands($all) as $namespace => $commands) { + $names = []; + /** @var Command $command */ + foreach ($commands as $name => $command) { + if (!$command->getName() || !$this->showHidden && $command->isHidden()) { + continue; + } + if ($command->getName() === $name) { + $this->commands[$name] = $command; + } else { + $this->aliases[$name] = $command; + } + $names[] = $name; + } + $this->namespaces[$namespace] = ['id' => $namespace, 'commands' => $names]; + } + } + private function sortCommands(array $commands) : array + { + $namespacedCommands = []; + $globalCommands = []; + $sortedCommands = []; + foreach ($commands as $name => $command) { + $key = $this->application->extractNamespace($name, 1); + if (\in_array($key, ['', self::GLOBAL_NAMESPACE], \true)) { + $globalCommands[$name] = $command; + } else { + $namespacedCommands[$key][$name] = $command; + } + } + if ($globalCommands) { + \ksort($globalCommands); + $sortedCommands[self::GLOBAL_NAMESPACE] = $globalCommands; + } + if ($namespacedCommands) { + \ksort($namespacedCommands, \SORT_STRING); + foreach ($namespacedCommands as $key => $commandsSet) { + \ksort($commandsSet); + $sortedCommands[$key] = $commandsSet; + } + } + return $sortedCommands; + } +} diff --git a/vendor/symfony/console/Descriptor/Descriptor.php b/vendor/symfony/console/Descriptor/Descriptor.php new file mode 100644 index 00000000..104eb679 --- /dev/null +++ b/vendor/symfony/console/Descriptor/Descriptor.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Descriptor; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * @author Jean-François Simon + * + * @internal + */ +abstract class Descriptor implements DescriptorInterface +{ + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + protected $output; + public function describe(OutputInterface $output, object $object, array $options = []) : void + { + $this->output = $output; + switch (\true) { + case $object instanceof InputArgument: + $this->describeInputArgument($object, $options); + break; + case $object instanceof InputOption: + $this->describeInputOption($object, $options); + break; + case $object instanceof InputDefinition: + $this->describeInputDefinition($object, $options); + break; + case $object instanceof Command: + $this->describeCommand($object, $options); + break; + case $object instanceof Application: + $this->describeApplication($object, $options); + break; + default: + throw new InvalidArgumentException(\sprintf('Object of type "%s" is not describable.', \get_debug_type($object))); + } + } + protected function write(string $content, bool $decorated = \false) : void + { + $this->output->write($content, \false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW); + } + /** + * Describes an InputArgument instance. + */ + protected abstract function describeInputArgument(InputArgument $argument, array $options = []) : void; + /** + * Describes an InputOption instance. + */ + protected abstract function describeInputOption(InputOption $option, array $options = []) : void; + /** + * Describes an InputDefinition instance. + */ + protected abstract function describeInputDefinition(InputDefinition $definition, array $options = []) : void; + /** + * Describes a Command instance. + */ + protected abstract function describeCommand(Command $command, array $options = []) : void; + /** + * Describes an Application instance. + */ + protected abstract function describeApplication(Application $application, array $options = []) : void; +} diff --git a/vendor/symfony/console/Descriptor/DescriptorInterface.php b/vendor/symfony/console/Descriptor/DescriptorInterface.php new file mode 100644 index 00000000..2103b724 --- /dev/null +++ b/vendor/symfony/console/Descriptor/DescriptorInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Descriptor; + +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * Descriptor interface. + * + * @author Jean-François Simon + */ +interface DescriptorInterface +{ + /** + * @return void + */ + public function describe(OutputInterface $output, object $object, array $options = []); +} diff --git a/vendor/symfony/console/Descriptor/JsonDescriptor.php b/vendor/symfony/console/Descriptor/JsonDescriptor.php new file mode 100644 index 00000000..7f3bc94f --- /dev/null +++ b/vendor/symfony/console/Descriptor/JsonDescriptor.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Descriptor; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +/** + * JSON descriptor. + * + * @author Jean-François Simon + * + * @internal + */ +class JsonDescriptor extends Descriptor +{ + protected function describeInputArgument(InputArgument $argument, array $options = []) : void + { + $this->writeData($this->getInputArgumentData($argument), $options); + } + protected function describeInputOption(InputOption $option, array $options = []) : void + { + $this->writeData($this->getInputOptionData($option), $options); + if ($option->isNegatable()) { + $this->writeData($this->getInputOptionData($option, \true), $options); + } + } + protected function describeInputDefinition(InputDefinition $definition, array $options = []) : void + { + $this->writeData($this->getInputDefinitionData($definition), $options); + } + protected function describeCommand(Command $command, array $options = []) : void + { + $this->writeData($this->getCommandData($command, $options['short'] ?? \false), $options); + } + protected function describeApplication(Application $application, array $options = []) : void + { + $describedNamespace = $options['namespace'] ?? null; + $description = new ApplicationDescription($application, $describedNamespace, \true); + $commands = []; + foreach ($description->getCommands() as $command) { + $commands[] = $this->getCommandData($command, $options['short'] ?? \false); + } + $data = []; + if ('UNKNOWN' !== $application->getName()) { + $data['application']['name'] = $application->getName(); + if ('UNKNOWN' !== $application->getVersion()) { + $data['application']['version'] = $application->getVersion(); + } + } + $data['commands'] = $commands; + if ($describedNamespace) { + $data['namespace'] = $describedNamespace; + } else { + $data['namespaces'] = \array_values($description->getNamespaces()); + } + $this->writeData($data, $options); + } + /** + * Writes data as json. + */ + private function writeData(array $data, array $options) : void + { + $flags = $options['json_encoding'] ?? 0; + $this->write(\json_encode($data, $flags)); + } + private function getInputArgumentData(InputArgument $argument) : array + { + return ['name' => $argument->getName(), 'is_required' => $argument->isRequired(), 'is_array' => $argument->isArray(), 'description' => \preg_replace('/\\s*[\\r\\n]\\s*/', ' ', $argument->getDescription()), 'default' => \INF === $argument->getDefault() ? 'INF' : $argument->getDefault()]; + } + private function getInputOptionData(InputOption $option, bool $negated = \false) : array + { + return $negated ? ['name' => '--no-' . $option->getName(), 'shortcut' => '', 'accept_value' => \false, 'is_value_required' => \false, 'is_multiple' => \false, 'description' => 'Negate the "--' . $option->getName() . '" option', 'default' => \false] : ['name' => '--' . $option->getName(), 'shortcut' => $option->getShortcut() ? '-' . \str_replace('|', '|-', $option->getShortcut()) : '', 'accept_value' => $option->acceptValue(), 'is_value_required' => $option->isValueRequired(), 'is_multiple' => $option->isArray(), 'description' => \preg_replace('/\\s*[\\r\\n]\\s*/', ' ', $option->getDescription()), 'default' => \INF === $option->getDefault() ? 'INF' : $option->getDefault()]; + } + private function getInputDefinitionData(InputDefinition $definition) : array + { + $inputArguments = []; + foreach ($definition->getArguments() as $name => $argument) { + $inputArguments[$name] = $this->getInputArgumentData($argument); + } + $inputOptions = []; + foreach ($definition->getOptions() as $name => $option) { + $inputOptions[$name] = $this->getInputOptionData($option); + if ($option->isNegatable()) { + $inputOptions['no-' . $name] = $this->getInputOptionData($option, \true); + } + } + return ['arguments' => $inputArguments, 'options' => $inputOptions]; + } + private function getCommandData(Command $command, bool $short = \false) : array + { + $data = ['name' => $command->getName(), 'description' => $command->getDescription()]; + if ($short) { + $data += ['usage' => $command->getAliases()]; + } else { + $command->mergeApplicationDefinition(\false); + $data += ['usage' => \array_merge([$command->getSynopsis()], $command->getUsages(), $command->getAliases()), 'help' => $command->getProcessedHelp(), 'definition' => $this->getInputDefinitionData($command->getDefinition())]; + } + $data['hidden'] = $command->isHidden(); + return $data; + } +} diff --git a/vendor/symfony/console/Descriptor/MarkdownDescriptor.php b/vendor/symfony/console/Descriptor/MarkdownDescriptor.php new file mode 100644 index 00000000..1d4485f0 --- /dev/null +++ b/vendor/symfony/console/Descriptor/MarkdownDescriptor.php @@ -0,0 +1,128 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Descriptor; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\Helper; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * Markdown descriptor. + * + * @author Jean-François Simon + * + * @internal + */ +class MarkdownDescriptor extends Descriptor +{ + public function describe(OutputInterface $output, object $object, array $options = []) : void + { + $decorated = $output->isDecorated(); + $output->setDecorated(\false); + parent::describe($output, $object, $options); + $output->setDecorated($decorated); + } + protected function write(string $content, bool $decorated = \true) : void + { + parent::write($content, $decorated); + } + protected function describeInputArgument(InputArgument $argument, array $options = []) : void + { + $this->write('#### `' . ($argument->getName() ?: '') . "`\n\n" . ($argument->getDescription() ? \preg_replace('/\\s*[\\r\\n]\\s*/', "\n", $argument->getDescription()) . "\n\n" : '') . '* Is required: ' . ($argument->isRequired() ? 'yes' : 'no') . "\n" . '* Is array: ' . ($argument->isArray() ? 'yes' : 'no') . "\n" . '* Default: `' . \str_replace("\n", '', \var_export($argument->getDefault(), \true)) . '`'); + } + protected function describeInputOption(InputOption $option, array $options = []) : void + { + $name = '--' . $option->getName(); + if ($option->isNegatable()) { + $name .= '|--no-' . $option->getName(); + } + if ($option->getShortcut()) { + $name .= '|-' . \str_replace('|', '|-', $option->getShortcut()) . ''; + } + $this->write('#### `' . $name . '`' . "\n\n" . ($option->getDescription() ? \preg_replace('/\\s*[\\r\\n]\\s*/', "\n", $option->getDescription()) . "\n\n" : '') . '* Accept value: ' . ($option->acceptValue() ? 'yes' : 'no') . "\n" . '* Is value required: ' . ($option->isValueRequired() ? 'yes' : 'no') . "\n" . '* Is multiple: ' . ($option->isArray() ? 'yes' : 'no') . "\n" . '* Is negatable: ' . ($option->isNegatable() ? 'yes' : 'no') . "\n" . '* Default: `' . \str_replace("\n", '', \var_export($option->getDefault(), \true)) . '`'); + } + protected function describeInputDefinition(InputDefinition $definition, array $options = []) : void + { + if ($showArguments = \count($definition->getArguments()) > 0) { + $this->write('### Arguments'); + foreach ($definition->getArguments() as $argument) { + $this->write("\n\n"); + $this->describeInputArgument($argument); + } + } + if (\count($definition->getOptions()) > 0) { + if ($showArguments) { + $this->write("\n\n"); + } + $this->write('### Options'); + foreach ($definition->getOptions() as $option) { + $this->write("\n\n"); + $this->describeInputOption($option); + } + } + } + protected function describeCommand(Command $command, array $options = []) : void + { + if ($options['short'] ?? \false) { + $this->write('`' . $command->getName() . "`\n" . \str_repeat('-', Helper::width($command->getName()) + 2) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . '### Usage' . "\n\n" . \array_reduce($command->getAliases(), function ($carry, $usage) { + return $carry . '* `' . $usage . '`' . "\n"; + })); + return; + } + $command->mergeApplicationDefinition(\false); + $this->write('`' . $command->getName() . "`\n" . \str_repeat('-', Helper::width($command->getName()) + 2) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . '### Usage' . "\n\n" . \array_reduce(\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), function ($carry, $usage) { + return $carry . '* `' . $usage . '`' . "\n"; + })); + if ($help = $command->getProcessedHelp()) { + $this->write("\n"); + $this->write($help); + } + $definition = $command->getDefinition(); + if ($definition->getOptions() || $definition->getArguments()) { + $this->write("\n\n"); + $this->describeInputDefinition($definition); + } + } + protected function describeApplication(Application $application, array $options = []) : void + { + $describedNamespace = $options['namespace'] ?? null; + $description = new ApplicationDescription($application, $describedNamespace); + $title = $this->getApplicationTitle($application); + $this->write($title . "\n" . \str_repeat('=', Helper::width($title))); + foreach ($description->getNamespaces() as $namespace) { + if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { + $this->write("\n\n"); + $this->write('**' . $namespace['id'] . ':**'); + } + $this->write("\n\n"); + $this->write(\implode("\n", \array_map(function ($commandName) use($description) { + return \sprintf('* [`%s`](#%s)', $commandName, \str_replace(':', '', $description->getCommand($commandName)->getName())); + }, $namespace['commands']))); + } + foreach ($description->getCommands() as $command) { + $this->write("\n\n"); + $this->describeCommand($command, $options); + } + } + private function getApplicationTitle(Application $application) : string + { + if ('UNKNOWN' !== $application->getName()) { + if ('UNKNOWN' !== $application->getVersion()) { + return \sprintf('%s %s', $application->getName(), $application->getVersion()); + } + return $application->getName(); + } + return 'Console Tool'; + } +} diff --git a/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php b/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php new file mode 100644 index 00000000..19ba9dfc --- /dev/null +++ b/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php @@ -0,0 +1,234 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Descriptor; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\Helper; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\String\UnicodeString; +class ReStructuredTextDescriptor extends Descriptor +{ + //

    + /** + * @var string + */ + private $partChar = '='; + //

    + /** + * @var string + */ + private $chapterChar = '-'; + //

    + /** + * @var string + */ + private $sectionChar = '~'; + //

    + /** + * @var string + */ + private $subsectionChar = '.'; + //

    + /** + * @var string + */ + private $subsubsectionChar = '^'; + //
    + /** + * @var string + */ + private $paragraphsChar = '"'; + /** + * @var mixed[] + */ + private $visibleNamespaces = []; + public function describe(OutputInterface $output, object $object, array $options = []) : void + { + $decorated = $output->isDecorated(); + $output->setDecorated(\false); + parent::describe($output, $object, $options); + $output->setDecorated($decorated); + } + /** + * Override parent method to set $decorated = true. + */ + protected function write(string $content, bool $decorated = \true) : void + { + parent::write($content, $decorated); + } + protected function describeInputArgument(InputArgument $argument, array $options = []) : void + { + $this->write($argument->getName() ?: '' . "\n" . \str_repeat($this->paragraphsChar, Helper::width($argument->getName())) . "\n\n" . ($argument->getDescription() ? \preg_replace('/\\s*[\\r\\n]\\s*/', "\n", $argument->getDescription()) . "\n\n" : '') . '- **Is required**: ' . ($argument->isRequired() ? 'yes' : 'no') . "\n" . '- **Is array**: ' . ($argument->isArray() ? 'yes' : 'no') . "\n" . '- **Default**: ``' . \str_replace("\n", '', \var_export($argument->getDefault(), \true)) . '``'); + } + protected function describeInputOption(InputOption $option, array $options = []) : void + { + $name = '\\-\\-' . $option->getName(); + if ($option->isNegatable()) { + $name .= '|\\-\\-no-' . $option->getName(); + } + if ($option->getShortcut()) { + $name .= '|-' . \str_replace('|', '|-', $option->getShortcut()); + } + $optionDescription = $option->getDescription() ? \preg_replace('/\\s*[\\r\\n]\\s*/', "\n\n", $option->getDescription()) . "\n\n" : ''; + $optionDescription = (new UnicodeString($optionDescription))->ascii(); + $this->write($name . "\n" . \str_repeat($this->paragraphsChar, Helper::width($name)) . "\n\n" . $optionDescription . '- **Accept value**: ' . ($option->acceptValue() ? 'yes' : 'no') . "\n" . '- **Is value required**: ' . ($option->isValueRequired() ? 'yes' : 'no') . "\n" . '- **Is multiple**: ' . ($option->isArray() ? 'yes' : 'no') . "\n" . '- **Is negatable**: ' . ($option->isNegatable() ? 'yes' : 'no') . "\n" . '- **Default**: ``' . \str_replace("\n", '', \var_export($option->getDefault(), \true)) . '``' . "\n"); + } + protected function describeInputDefinition(InputDefinition $definition, array $options = []) : void + { + if ($showArguments = (bool) $definition->getArguments()) { + $this->write("Arguments\n" . \str_repeat($this->subsubsectionChar, 9)) . "\n\n"; + foreach ($definition->getArguments() as $argument) { + $this->write("\n\n"); + $this->describeInputArgument($argument); + } + } + if ($nonDefaultOptions = $this->getNonDefaultOptions($definition)) { + if ($showArguments) { + $this->write("\n\n"); + } + $this->write("Options\n" . \str_repeat($this->subsubsectionChar, 7) . "\n\n"); + foreach ($nonDefaultOptions as $option) { + $this->describeInputOption($option); + $this->write("\n"); + } + } + } + protected function describeCommand(Command $command, array $options = []) : void + { + if ($options['short'] ?? \false) { + $this->write('``' . $command->getName() . "``\n" . \str_repeat($this->subsectionChar, Helper::width($command->getName())) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . "Usage\n" . \str_repeat($this->paragraphsChar, 5) . "\n\n" . \array_reduce($command->getAliases(), static function ($carry, $usage) { + return $carry . '- ``' . $usage . '``' . "\n"; + })); + return; + } + $command->mergeApplicationDefinition(\false); + foreach ($command->getAliases() as $alias) { + $this->write('.. _' . $alias . ":\n\n"); + } + $this->write($command->getName() . "\n" . \str_repeat($this->subsectionChar, Helper::width($command->getName())) . "\n\n" . ($command->getDescription() ? $command->getDescription() . "\n\n" : '') . "Usage\n" . \str_repeat($this->subsubsectionChar, 5) . "\n\n" . \array_reduce(\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), static function ($carry, $usage) { + return $carry . '- ``' . $usage . '``' . "\n"; + })); + if ($help = $command->getProcessedHelp()) { + $this->write("\n"); + $this->write($help); + } + $definition = $command->getDefinition(); + if ($definition->getOptions() || $definition->getArguments()) { + $this->write("\n\n"); + $this->describeInputDefinition($definition); + } + } + protected function describeApplication(Application $application, array $options = []) : void + { + $description = new ApplicationDescription($application, $options['namespace'] ?? null); + $title = $this->getApplicationTitle($application); + $this->write($title . "\n" . \str_repeat($this->partChar, Helper::width($title))); + $this->createTableOfContents($description, $application); + $this->describeCommands($application, $options); + } + private function getApplicationTitle(Application $application) : string + { + if ('UNKNOWN' === $application->getName()) { + return 'Console Tool'; + } + if ('UNKNOWN' !== $application->getVersion()) { + return \sprintf('%s %s', $application->getName(), $application->getVersion()); + } + return $application->getName(); + } + private function describeCommands($application, array $options) : void + { + $title = 'Commands'; + $this->write("\n\n{$title}\n" . \str_repeat($this->chapterChar, Helper::width($title)) . "\n\n"); + foreach ($this->visibleNamespaces as $namespace) { + if ('_global' === $namespace) { + $commands = $application->all(''); + $this->write('Global' . "\n" . \str_repeat($this->sectionChar, Helper::width('Global')) . "\n\n"); + } else { + $commands = $application->all($namespace); + $this->write($namespace . "\n" . \str_repeat($this->sectionChar, Helper::width($namespace)) . "\n\n"); + } + foreach ($this->removeAliasesAndHiddenCommands($commands) as $command) { + $this->describeCommand($command, $options); + $this->write("\n\n"); + } + } + } + private function createTableOfContents(ApplicationDescription $description, Application $application) : void + { + $this->setVisibleNamespaces($description); + $chapterTitle = 'Table of Contents'; + $this->write("\n\n{$chapterTitle}\n" . \str_repeat($this->chapterChar, Helper::width($chapterTitle)) . "\n\n"); + foreach ($this->visibleNamespaces as $namespace) { + if ('_global' === $namespace) { + $commands = $application->all(''); + } else { + $commands = $application->all($namespace); + $this->write("\n\n"); + $this->write($namespace . "\n" . \str_repeat($this->sectionChar, Helper::width($namespace)) . "\n\n"); + } + $commands = $this->removeAliasesAndHiddenCommands($commands); + $this->write("\n\n"); + $this->write(\implode("\n", \array_map(static function ($commandName) { + return \sprintf('- `%s`_', $commandName); + }, \array_keys($commands)))); + } + } + private function getNonDefaultOptions(InputDefinition $definition) : array + { + $globalOptions = ['help', 'quiet', 'verbose', 'version', 'ansi', 'no-interaction']; + $nonDefaultOptions = []; + foreach ($definition->getOptions() as $option) { + // Skip global options. + if (!\in_array($option->getName(), $globalOptions)) { + $nonDefaultOptions[] = $option; + } + } + return $nonDefaultOptions; + } + private function setVisibleNamespaces(ApplicationDescription $description) : void + { + $commands = $description->getCommands(); + foreach ($description->getNamespaces() as $namespace) { + try { + $namespaceCommands = $namespace['commands']; + foreach ($namespaceCommands as $key => $commandName) { + if (!\array_key_exists($commandName, $commands)) { + // If the array key does not exist, then this is an alias. + unset($namespaceCommands[$key]); + } elseif ($commands[$commandName]->isHidden()) { + unset($namespaceCommands[$key]); + } + } + if (!$namespaceCommands) { + // If the namespace contained only aliases or hidden commands, skip the namespace. + continue; + } + } catch (\Exception $exception) { + } + $this->visibleNamespaces[] = $namespace['id']; + } + } + private function removeAliasesAndHiddenCommands(array $commands) : array + { + foreach ($commands as $key => $command) { + if ($command->isHidden() || \in_array($key, $command->getAliases(), \true)) { + unset($commands[$key]); + } + } + unset($commands['completion']); + return $commands; + } +} diff --git a/vendor/symfony/console/Descriptor/TextDescriptor.php b/vendor/symfony/console/Descriptor/TextDescriptor.php new file mode 100644 index 00000000..71494a0d --- /dev/null +++ b/vendor/symfony/console/Descriptor/TextDescriptor.php @@ -0,0 +1,274 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Descriptor; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatter; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\Helper; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +/** + * Text descriptor. + * + * @author Jean-François Simon + * + * @internal + */ +class TextDescriptor extends Descriptor +{ + protected function describeInputArgument(InputArgument $argument, array $options = []) : void + { + if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) { + $default = \sprintf(' [default: %s]', $this->formatDefaultValue($argument->getDefault())); + } else { + $default = ''; + } + $totalWidth = $options['total_width'] ?? Helper::width($argument->getName()); + $spacingWidth = $totalWidth - \strlen($argument->getName()); + $this->writeText(\sprintf( + ' %s %s%s%s', + $argument->getName(), + \str_repeat(' ', $spacingWidth), + // + 4 = 2 spaces before , 2 spaces after + \preg_replace('/\\s*[\\r\\n]\\s*/', "\n" . \str_repeat(' ', $totalWidth + 4), $argument->getDescription()), + $default + ), $options); + } + protected function describeInputOption(InputOption $option, array $options = []) : void + { + if ($option->acceptValue() && null !== $option->getDefault() && (!\is_array($option->getDefault()) || \count($option->getDefault()))) { + $default = \sprintf(' [default: %s]', $this->formatDefaultValue($option->getDefault())); + } else { + $default = ''; + } + $value = ''; + if ($option->acceptValue()) { + $value = '=' . \strtoupper($option->getName()); + if ($option->isValueOptional()) { + $value = '[' . $value . ']'; + } + } + $totalWidth = $options['total_width'] ?? $this->calculateTotalWidthForOptions([$option]); + $synopsis = \sprintf('%s%s', $option->getShortcut() ? \sprintf('-%s, ', $option->getShortcut()) : ' ', \sprintf($option->isNegatable() ? '--%1$s|--no-%1$s' : '--%1$s%2$s', $option->getName(), $value)); + $spacingWidth = $totalWidth - Helper::width($synopsis); + $this->writeText(\sprintf( + ' %s %s%s%s%s', + $synopsis, + \str_repeat(' ', $spacingWidth), + // + 4 = 2 spaces before , 2 spaces after + \preg_replace('/\\s*[\\r\\n]\\s*/', "\n" . \str_repeat(' ', $totalWidth + 4), $option->getDescription()), + $default, + $option->isArray() ? ' (multiple values allowed)' : '' + ), $options); + } + protected function describeInputDefinition(InputDefinition $definition, array $options = []) : void + { + $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions()); + foreach ($definition->getArguments() as $argument) { + $totalWidth = \max($totalWidth, Helper::width($argument->getName())); + } + if ($definition->getArguments()) { + $this->writeText('Arguments:', $options); + $this->writeText("\n"); + foreach ($definition->getArguments() as $argument) { + $this->describeInputArgument($argument, \array_merge($options, ['total_width' => $totalWidth])); + $this->writeText("\n"); + } + } + if ($definition->getArguments() && $definition->getOptions()) { + $this->writeText("\n"); + } + if ($definition->getOptions()) { + $laterOptions = []; + $this->writeText('Options:', $options); + foreach ($definition->getOptions() as $option) { + if (\strlen($option->getShortcut() ?? '') > 1) { + $laterOptions[] = $option; + continue; + } + $this->writeText("\n"); + $this->describeInputOption($option, \array_merge($options, ['total_width' => $totalWidth])); + } + foreach ($laterOptions as $option) { + $this->writeText("\n"); + $this->describeInputOption($option, \array_merge($options, ['total_width' => $totalWidth])); + } + } + } + protected function describeCommand(Command $command, array $options = []) : void + { + $command->mergeApplicationDefinition(\false); + if ($description = $command->getDescription()) { + $this->writeText('Description:', $options); + $this->writeText("\n"); + $this->writeText(' ' . $description); + $this->writeText("\n\n"); + } + $this->writeText('Usage:', $options); + foreach (\array_merge([$command->getSynopsis(\true)], $command->getAliases(), $command->getUsages()) as $usage) { + $this->writeText("\n"); + $this->writeText(' ' . OutputFormatter::escape($usage), $options); + } + $this->writeText("\n"); + $definition = $command->getDefinition(); + if ($definition->getOptions() || $definition->getArguments()) { + $this->writeText("\n"); + $this->describeInputDefinition($definition, $options); + $this->writeText("\n"); + } + $help = $command->getProcessedHelp(); + if ($help && $help !== $description) { + $this->writeText("\n"); + $this->writeText('Help:', $options); + $this->writeText("\n"); + $this->writeText(' ' . \str_replace("\n", "\n ", $help), $options); + $this->writeText("\n"); + } + } + protected function describeApplication(Application $application, array $options = []) : void + { + $describedNamespace = $options['namespace'] ?? null; + $description = new ApplicationDescription($application, $describedNamespace); + if (isset($options['raw_text']) && $options['raw_text']) { + $width = $this->getColumnWidth($description->getCommands()); + foreach ($description->getCommands() as $command) { + $this->writeText(\sprintf("%-{$width}s %s", $command->getName(), $command->getDescription()), $options); + $this->writeText("\n"); + } + } else { + if ('' != ($help = $application->getHelp())) { + $this->writeText("{$help}\n\n", $options); + } + $this->writeText("Usage:\n", $options); + $this->writeText(" command [options] [arguments]\n\n", $options); + $this->describeInputDefinition(new InputDefinition($application->getDefinition()->getOptions()), $options); + $this->writeText("\n"); + $this->writeText("\n"); + $commands = $description->getCommands(); + $namespaces = $description->getNamespaces(); + if ($describedNamespace && $namespaces) { + // make sure all alias commands are included when describing a specific namespace + $describedNamespaceInfo = \reset($namespaces); + foreach ($describedNamespaceInfo['commands'] as $name) { + $commands[$name] = $description->getCommand($name); + } + } + // calculate max. width based on available commands per namespace + $width = $this->getColumnWidth(\array_merge(...\array_values(\array_map(function ($namespace) use($commands) { + return \array_intersect($namespace['commands'], \array_keys($commands)); + }, \array_values($namespaces))))); + if ($describedNamespace) { + $this->writeText(\sprintf('Available commands for the "%s" namespace:', $describedNamespace), $options); + } else { + $this->writeText('Available commands:', $options); + } + foreach ($namespaces as $namespace) { + $namespace['commands'] = \array_filter($namespace['commands'], function ($name) use($commands) { + return isset($commands[$name]); + }); + if (!$namespace['commands']) { + continue; + } + if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { + $this->writeText("\n"); + $this->writeText(' ' . $namespace['id'] . '', $options); + } + foreach ($namespace['commands'] as $name) { + $this->writeText("\n"); + $spacingWidth = $width - Helper::width($name); + $command = $commands[$name]; + $commandAliases = $name === $command->getName() ? $this->getCommandAliasesText($command) : ''; + $this->writeText(\sprintf(' %s%s%s', $name, \str_repeat(' ', $spacingWidth), $commandAliases . $command->getDescription()), $options); + } + } + $this->writeText("\n"); + } + } + private function writeText(string $content, array $options = []) : void + { + $this->write(isset($options['raw_text']) && $options['raw_text'] ? \strip_tags($content) : $content, isset($options['raw_output']) ? !$options['raw_output'] : \true); + } + /** + * Formats command aliases to show them in the command description. + */ + private function getCommandAliasesText(Command $command) : string + { + $text = ''; + $aliases = $command->getAliases(); + if ($aliases) { + $text = '[' . \implode('|', $aliases) . '] '; + } + return $text; + } + /** + * Formats input option/argument default value. + * @param mixed $default + */ + private function formatDefaultValue($default) : string + { + if (\INF === $default) { + return 'INF'; + } + if (\is_string($default)) { + $default = OutputFormatter::escape($default); + } elseif (\is_array($default)) { + foreach ($default as $key => $value) { + if (\is_string($value)) { + $default[$key] = OutputFormatter::escape($value); + } + } + } + return \str_replace('\\\\', '\\', \json_encode($default, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE)); + } + /** + * @param array $commands + */ + private function getColumnWidth(array $commands) : int + { + $widths = []; + foreach ($commands as $command) { + if ($command instanceof Command) { + $widths[] = Helper::width($command->getName()); + foreach ($command->getAliases() as $alias) { + $widths[] = Helper::width($alias); + } + } else { + $widths[] = Helper::width($command); + } + } + return $widths ? \max($widths) + 2 : 0; + } + /** + * @param InputOption[] $options + */ + private function calculateTotalWidthForOptions(array $options) : int + { + $totalWidth = 0; + foreach ($options as $option) { + // "-" + shortcut + ", --" + name + $nameLength = 1 + \max(Helper::width($option->getShortcut()), 1) + 4 + Helper::width($option->getName()); + if ($option->isNegatable()) { + $nameLength += 6 + Helper::width($option->getName()); + // |--no- + name + } elseif ($option->acceptValue()) { + $valueLength = 1 + Helper::width($option->getName()); + // = + value + $valueLength += $option->isValueOptional() ? 2 : 0; + // [ + ] + $nameLength += $valueLength; + } + $totalWidth = \max($totalWidth, $nameLength); + } + return $totalWidth; + } +} diff --git a/vendor/symfony/console/Descriptor/XmlDescriptor.php b/vendor/symfony/console/Descriptor/XmlDescriptor.php new file mode 100644 index 00000000..fc79b523 --- /dev/null +++ b/vendor/symfony/console/Descriptor/XmlDescriptor.php @@ -0,0 +1,191 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Descriptor; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputDefinition; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +/** + * XML descriptor. + * + * @author Jean-François Simon + * + * @internal + */ +class XmlDescriptor extends Descriptor +{ + public function getInputDefinitionDocument(InputDefinition $definition) : \DOMDocument + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $dom->appendChild($definitionXML = $dom->createElement('definition')); + $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments')); + foreach ($definition->getArguments() as $argument) { + $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument)); + } + $definitionXML->appendChild($optionsXML = $dom->createElement('options')); + foreach ($definition->getOptions() as $option) { + $this->appendDocument($optionsXML, $this->getInputOptionDocument($option)); + } + return $dom; + } + public function getCommandDocument(Command $command, bool $short = \false) : \DOMDocument + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $dom->appendChild($commandXML = $dom->createElement('command')); + $commandXML->setAttribute('id', $command->getName()); + $commandXML->setAttribute('name', $command->getName()); + $commandXML->setAttribute('hidden', $command->isHidden() ? 1 : 0); + $commandXML->appendChild($usagesXML = $dom->createElement('usages')); + $commandXML->appendChild($descriptionXML = $dom->createElement('description')); + $descriptionXML->appendChild($dom->createTextNode(\str_replace("\n", "\n ", $command->getDescription()))); + if ($short) { + foreach ($command->getAliases() as $usage) { + $usagesXML->appendChild($dom->createElement('usage', $usage)); + } + } else { + $command->mergeApplicationDefinition(\false); + foreach (\array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()) as $usage) { + $usagesXML->appendChild($dom->createElement('usage', $usage)); + } + $commandXML->appendChild($helpXML = $dom->createElement('help')); + $helpXML->appendChild($dom->createTextNode(\str_replace("\n", "\n ", $command->getProcessedHelp()))); + $definitionXML = $this->getInputDefinitionDocument($command->getDefinition()); + $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0)); + } + return $dom; + } + public function getApplicationDocument(Application $application, ?string $namespace = null, bool $short = \false) : \DOMDocument + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $dom->appendChild($rootXml = $dom->createElement('symfony')); + if ('UNKNOWN' !== $application->getName()) { + $rootXml->setAttribute('name', $application->getName()); + if ('UNKNOWN' !== $application->getVersion()) { + $rootXml->setAttribute('version', $application->getVersion()); + } + } + $rootXml->appendChild($commandsXML = $dom->createElement('commands')); + $description = new ApplicationDescription($application, $namespace, \true); + if ($namespace) { + $commandsXML->setAttribute('namespace', $namespace); + } + foreach ($description->getCommands() as $command) { + $this->appendDocument($commandsXML, $this->getCommandDocument($command, $short)); + } + if (!$namespace) { + $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces')); + foreach ($description->getNamespaces() as $namespaceDescription) { + $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace')); + $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']); + foreach ($namespaceDescription['commands'] as $name) { + $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command')); + $commandXML->appendChild($dom->createTextNode($name)); + } + } + } + return $dom; + } + protected function describeInputArgument(InputArgument $argument, array $options = []) : void + { + $this->writeDocument($this->getInputArgumentDocument($argument)); + } + protected function describeInputOption(InputOption $option, array $options = []) : void + { + $this->writeDocument($this->getInputOptionDocument($option)); + } + protected function describeInputDefinition(InputDefinition $definition, array $options = []) : void + { + $this->writeDocument($this->getInputDefinitionDocument($definition)); + } + protected function describeCommand(Command $command, array $options = []) : void + { + $this->writeDocument($this->getCommandDocument($command, $options['short'] ?? \false)); + } + protected function describeApplication(Application $application, array $options = []) : void + { + $this->writeDocument($this->getApplicationDocument($application, $options['namespace'] ?? null, $options['short'] ?? \false)); + } + /** + * Appends document children to parent node. + */ + private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent) : void + { + foreach ($importedParent->childNodes as $childNode) { + $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, \true)); + } + } + /** + * Writes DOM document. + */ + private function writeDocument(\DOMDocument $dom) : void + { + $dom->formatOutput = \true; + $this->write($dom->saveXML()); + } + private function getInputArgumentDocument(InputArgument $argument) : \DOMDocument + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $dom->appendChild($objectXML = $dom->createElement('argument')); + $objectXML->setAttribute('name', $argument->getName()); + $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0); + $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0); + $objectXML->appendChild($descriptionXML = $dom->createElement('description')); + $descriptionXML->appendChild($dom->createTextNode($argument->getDescription())); + $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); + $defaults = \is_array($argument->getDefault()) ? $argument->getDefault() : (\is_bool($argument->getDefault()) ? [\var_export($argument->getDefault(), \true)] : ($argument->getDefault() ? [$argument->getDefault()] : [])); + foreach ($defaults as $default) { + $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); + $defaultXML->appendChild($dom->createTextNode($default)); + } + return $dom; + } + private function getInputOptionDocument(InputOption $option) : \DOMDocument + { + $dom = new \DOMDocument('1.0', 'UTF-8'); + $dom->appendChild($objectXML = $dom->createElement('option')); + $objectXML->setAttribute('name', '--' . $option->getName()); + $pos = \strpos($option->getShortcut() ?? '', '|'); + if (\false !== $pos) { + $objectXML->setAttribute('shortcut', '-' . \substr($option->getShortcut(), 0, $pos)); + $objectXML->setAttribute('shortcuts', '-' . \str_replace('|', '|-', $option->getShortcut())); + } else { + $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-' . $option->getShortcut() : ''); + } + $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0); + $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0); + $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0); + $objectXML->appendChild($descriptionXML = $dom->createElement('description')); + $descriptionXML->appendChild($dom->createTextNode($option->getDescription())); + if ($option->acceptValue()) { + $defaults = \is_array($option->getDefault()) ? $option->getDefault() : (\is_bool($option->getDefault()) ? [\var_export($option->getDefault(), \true)] : ($option->getDefault() ? [$option->getDefault()] : [])); + $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); + if (!empty($defaults)) { + foreach ($defaults as $default) { + $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); + $defaultXML->appendChild($dom->createTextNode($default)); + } + } + } + if ($option->isNegatable()) { + $dom->appendChild($objectXML = $dom->createElement('option')); + $objectXML->setAttribute('name', '--no-' . $option->getName()); + $objectXML->setAttribute('shortcut', ''); + $objectXML->setAttribute('accept_value', 0); + $objectXML->setAttribute('is_value_required', 0); + $objectXML->setAttribute('is_multiple', 0); + $objectXML->appendChild($descriptionXML = $dom->createElement('description')); + $descriptionXML->appendChild($dom->createTextNode('Negate the "--' . $option->getName() . '" option')); + } + return $dom; + } +} diff --git a/vendor/symfony/console/Event/ConsoleCommandEvent.php b/vendor/symfony/console/Event/ConsoleCommandEvent.php new file mode 100644 index 00000000..1fc65d9d --- /dev/null +++ b/vendor/symfony/console/Event/ConsoleCommandEvent.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Event; + +/** + * Allows to do things before the command is executed, like skipping the command or executing code before the command is + * going to be executed. + * + * Changing the input arguments will have no effect. + * + * @author Fabien Potencier + */ +final class ConsoleCommandEvent extends ConsoleEvent +{ + /** + * The return code for skipped commands, this will also be passed into the terminate event. + */ + public const RETURN_CODE_DISABLED = 113; + /** + * Indicates if the command should be run or skipped. + * @var bool + */ + private $commandShouldRun = \true; + /** + * Disables the command, so it won't be run. + */ + public function disableCommand() : bool + { + return $this->commandShouldRun = \false; + } + public function enableCommand() : bool + { + return $this->commandShouldRun = \true; + } + /** + * Returns true if the command is runnable, false otherwise. + */ + public function commandShouldRun() : bool + { + return $this->commandShouldRun; + } +} diff --git a/vendor/symfony/console/Event/ConsoleErrorEvent.php b/vendor/symfony/console/Event/ConsoleErrorEvent.php new file mode 100644 index 00000000..ea7896cf --- /dev/null +++ b/vendor/symfony/console/Event/ConsoleErrorEvent.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Event; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * Allows to handle throwables thrown while running a command. + * + * @author Wouter de Jong + */ +final class ConsoleErrorEvent extends ConsoleEvent +{ + /** + * @var \Throwable + */ + private $error; + /** + * @var int + */ + private $exitCode; + public function __construct(InputInterface $input, OutputInterface $output, \Throwable $error, ?Command $command = null) + { + parent::__construct($command, $input, $output); + $this->error = $error; + } + public function getError() : \Throwable + { + return $this->error; + } + public function setError(\Throwable $error) : void + { + $this->error = $error; + } + public function setExitCode(int $exitCode) : void + { + $this->exitCode = $exitCode; + $r = new \ReflectionProperty($this->error, 'code'); + $r->setAccessible(\true); + $r->setValue($this->error, $this->exitCode); + } + public function getExitCode() : int + { + return $this->exitCode ?? (\is_int($this->error->getCode()) && 0 !== $this->error->getCode() ? $this->error->getCode() : 1); + } +} diff --git a/vendor/symfony/console/Event/ConsoleEvent.php b/vendor/symfony/console/Event/ConsoleEvent.php new file mode 100644 index 00000000..6362ddc6 --- /dev/null +++ b/vendor/symfony/console/Event/ConsoleEvent.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Event; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Contracts\EventDispatcher\Event; +/** + * Allows to inspect input and output of a command. + * + * @author Francesco Levorato + */ +class ConsoleEvent extends Event +{ + protected $command; + /** + * @var \Symfony\Component\Console\Input\InputInterface + */ + private $input; + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $output; + public function __construct(?Command $command, InputInterface $input, OutputInterface $output) + { + $this->command = $command; + $this->input = $input; + $this->output = $output; + } + /** + * Gets the command that is executed. + */ + public function getCommand() : ?Command + { + return $this->command; + } + /** + * Gets the input instance. + */ + public function getInput() : InputInterface + { + return $this->input; + } + /** + * Gets the output instance. + */ + public function getOutput() : OutputInterface + { + return $this->output; + } +} diff --git a/vendor/symfony/console/Event/ConsoleSignalEvent.php b/vendor/symfony/console/Event/ConsoleSignalEvent.php new file mode 100644 index 00000000..b1995d40 --- /dev/null +++ b/vendor/symfony/console/Event/ConsoleSignalEvent.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Event; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * @author marie + */ +final class ConsoleSignalEvent extends ConsoleEvent +{ + /** + * @var int + */ + private $handlingSignal; + /** + * @var int|false + */ + private $exitCode; + /** + * @param int|false $exitCode + */ + public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $handlingSignal, $exitCode = 0) + { + parent::__construct($command, $input, $output); + $this->handlingSignal = $handlingSignal; + $this->exitCode = $exitCode; + } + public function getHandlingSignal() : int + { + return $this->handlingSignal; + } + public function setExitCode(int $exitCode) : void + { + if ($exitCode < 0 || $exitCode > 255) { + throw new \InvalidArgumentException('Exit code must be between 0 and 255.'); + } + $this->exitCode = $exitCode; + } + public function abortExit() : void + { + $this->exitCode = \false; + } + /** + * @return int|false + */ + public function getExitCode() + { + return $this->exitCode; + } +} diff --git a/vendor/symfony/console/Event/ConsoleTerminateEvent.php b/vendor/symfony/console/Event/ConsoleTerminateEvent.php new file mode 100644 index 00000000..2abd6136 --- /dev/null +++ b/vendor/symfony/console/Event/ConsoleTerminateEvent.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Event; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * Allows to manipulate the exit code of a command after its execution. + * + * @author Francesco Levorato + * @author Jules Pietri + */ +final class ConsoleTerminateEvent extends ConsoleEvent +{ + /** + * @var int + */ + private $exitCode; + /** + * @readonly + * @var int|null + */ + private $interruptingSignal; + public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $exitCode, ?int $interruptingSignal = null) + { + $this->exitCode = $exitCode; + $this->interruptingSignal = $interruptingSignal; + parent::__construct($command, $input, $output); + } + public function setExitCode(int $exitCode) : void + { + $this->exitCode = $exitCode; + } + public function getExitCode() : int + { + return $this->exitCode; + } + public function getInterruptingSignal() : ?int + { + return $this->interruptingSignal; + } +} diff --git a/vendor/symfony/console/EventListener/ErrorListener.php b/vendor/symfony/console/EventListener/ErrorListener.php new file mode 100644 index 00000000..2302ef05 --- /dev/null +++ b/vendor/symfony/console/EventListener/ErrorListener.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\EventListener; + +use RuleDocGenerator202403\Psr\Log\LoggerInterface; +use RuleDocGenerator202403\Symfony\Component\Console\ConsoleEvents; +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleErrorEvent; +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleEvent; +use RuleDocGenerator202403\Symfony\Component\Console\Event\ConsoleTerminateEvent; +use RuleDocGenerator202403\Symfony\Component\EventDispatcher\EventSubscriberInterface; +/** + * @author James Halsall + * @author Robin Chalas + */ +class ErrorListener implements EventSubscriberInterface +{ + /** + * @var \Psr\Log\LoggerInterface|null + */ + private $logger; + public function __construct(?LoggerInterface $logger = null) + { + $this->logger = $logger; + } + /** + * @return void + */ + public function onConsoleError(ConsoleErrorEvent $event) + { + if (null === $this->logger) { + return; + } + $error = $event->getError(); + if (!($inputString = $this->getInputString($event))) { + $this->logger->critical('An error occurred while using the console. Message: "{message}"', ['exception' => $error, 'message' => $error->getMessage()]); + return; + } + $this->logger->critical('Error thrown while running command "{command}". Message: "{message}"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]); + } + /** + * @return void + */ + public function onConsoleTerminate(ConsoleTerminateEvent $event) + { + if (null === $this->logger) { + return; + } + $exitCode = $event->getExitCode(); + if (0 === $exitCode) { + return; + } + if (!($inputString = $this->getInputString($event))) { + $this->logger->debug('The console exited with code "{code}"', ['code' => $exitCode]); + return; + } + $this->logger->debug('Command "{command}" exited with code "{code}"', ['command' => $inputString, 'code' => $exitCode]); + } + public static function getSubscribedEvents() : array + { + return [ConsoleEvents::ERROR => ['onConsoleError', -128], ConsoleEvents::TERMINATE => ['onConsoleTerminate', -128]]; + } + private static function getInputString(ConsoleEvent $event) : ?string + { + $commandName = ($nullsafeVariable1 = $event->getCommand()) ? $nullsafeVariable1->getName() : null; + $input = $event->getInput(); + if ($input instanceof \Stringable) { + if ($commandName) { + return \str_replace(["'{$commandName}'", "\"{$commandName}\""], $commandName, (string) $input); + } + return (string) $input; + } + return $commandName; + } +} diff --git a/vendor/symfony/console/Exception/CommandNotFoundException.php b/vendor/symfony/console/Exception/CommandNotFoundException.php new file mode 100644 index 00000000..edd96f2c --- /dev/null +++ b/vendor/symfony/console/Exception/CommandNotFoundException.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Exception; + +/** + * Represents an incorrect command name typed in the console. + * + * @author Jérôme Tamarelle + */ +class CommandNotFoundException extends \InvalidArgumentException implements ExceptionInterface +{ + /** + * @var mixed[] + */ + private $alternatives; + /** + * @param string $message Exception message to throw + * @param string[] $alternatives List of similar defined names + * @param int $code Exception code + * @param \Throwable|null $previous Previous exception used for the exception chaining + */ + public function __construct(string $message, array $alternatives = [], int $code = 0, ?\Throwable $previous = null) + { + parent::__construct($message, $code, $previous); + $this->alternatives = $alternatives; + } + /** + * @return string[] + */ + public function getAlternatives() : array + { + return $this->alternatives; + } +} diff --git a/vendor/symfony/console/Exception/ExceptionInterface.php b/vendor/symfony/console/Exception/ExceptionInterface.php new file mode 100644 index 00000000..e0ff4789 --- /dev/null +++ b/vendor/symfony/console/Exception/ExceptionInterface.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Exception; + +/** + * ExceptionInterface. + * + * @author Jérôme Tamarelle + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/console/Exception/InvalidArgumentException.php b/vendor/symfony/console/Exception/InvalidArgumentException.php new file mode 100644 index 00000000..dee3450c --- /dev/null +++ b/vendor/symfony/console/Exception/InvalidArgumentException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Exception; + +/** + * @author Jérôme Tamarelle + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/console/Exception/InvalidOptionException.php b/vendor/symfony/console/Exception/InvalidOptionException.php new file mode 100644 index 00000000..9057ba70 --- /dev/null +++ b/vendor/symfony/console/Exception/InvalidOptionException.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Exception; + +/** + * Represents an incorrect option name or value typed in the console. + * + * @author Jérôme Tamarelle + */ +class InvalidOptionException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/console/Exception/LogicException.php b/vendor/symfony/console/Exception/LogicException.php new file mode 100644 index 00000000..66ecea15 --- /dev/null +++ b/vendor/symfony/console/Exception/LogicException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Exception; + +/** + * @author Jérôme Tamarelle + */ +class LogicException extends \LogicException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/console/Exception/MissingInputException.php b/vendor/symfony/console/Exception/MissingInputException.php new file mode 100644 index 00000000..af01b954 --- /dev/null +++ b/vendor/symfony/console/Exception/MissingInputException.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Exception; + +/** + * Represents failure to read input from stdin. + * + * @author Gabriel Ostrolucký + */ +class MissingInputException extends RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/console/Exception/NamespaceNotFoundException.php b/vendor/symfony/console/Exception/NamespaceNotFoundException.php new file mode 100644 index 00000000..362643ba --- /dev/null +++ b/vendor/symfony/console/Exception/NamespaceNotFoundException.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Exception; + +/** + * Represents an incorrect namespace typed in the console. + * + * @author Pierre du Plessis + */ +class NamespaceNotFoundException extends CommandNotFoundException +{ +} diff --git a/vendor/symfony/console/Exception/RunCommandFailedException.php b/vendor/symfony/console/Exception/RunCommandFailedException.php new file mode 100644 index 00000000..119da9e6 --- /dev/null +++ b/vendor/symfony/console/Exception/RunCommandFailedException.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Exception; + +use RuleDocGenerator202403\Symfony\Component\Console\Messenger\RunCommandContext; +/** + * @author Kevin Bond + */ +final class RunCommandFailedException extends RuntimeException +{ + /** + * @readonly + * @var \Symfony\Component\Console\Messenger\RunCommandContext + */ + public $context; + /** + * @param \Throwable|string $exception + */ + public function __construct($exception, RunCommandContext $context) + { + $this->context = $context; + parent::__construct($exception instanceof \Throwable ? $exception->getMessage() : $exception, $exception instanceof \Throwable ? $exception->getCode() : 0, $exception instanceof \Throwable ? $exception : null); + } +} diff --git a/vendor/symfony/console/Exception/RuntimeException.php b/vendor/symfony/console/Exception/RuntimeException.php new file mode 100644 index 00000000..b716c5be --- /dev/null +++ b/vendor/symfony/console/Exception/RuntimeException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Exception; + +/** + * @author Jérôme Tamarelle + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/console/Formatter/NullOutputFormatter.php b/vendor/symfony/console/Formatter/NullOutputFormatter.php new file mode 100644 index 00000000..ba0c813c --- /dev/null +++ b/vendor/symfony/console/Formatter/NullOutputFormatter.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Formatter; + +/** + * @author Tien Xuan Vo + */ +final class NullOutputFormatter implements OutputFormatterInterface +{ + /** + * @var \Symfony\Component\Console\Formatter\NullOutputFormatterStyle + */ + private $style; + public function format(?string $message) : ?string + { + return null; + } + public function getStyle(string $name) : OutputFormatterStyleInterface + { + // to comply with the interface we must return a OutputFormatterStyleInterface + return $this->style = $this->style ?? new NullOutputFormatterStyle(); + } + public function hasStyle(string $name) : bool + { + return \false; + } + public function isDecorated() : bool + { + return \false; + } + public function setDecorated(bool $decorated) : void + { + // do nothing + } + public function setStyle(string $name, OutputFormatterStyleInterface $style) : void + { + // do nothing + } +} diff --git a/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php b/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php new file mode 100644 index 00000000..e7c41481 --- /dev/null +++ b/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Formatter; + +/** + * @author Tien Xuan Vo + */ +final class NullOutputFormatterStyle implements OutputFormatterStyleInterface +{ + public function apply(string $text) : string + { + return $text; + } + public function setBackground(?string $color = null) : void + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + // do nothing + } + public function setForeground(?string $color = null) : void + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + // do nothing + } + public function setOption(string $option) : void + { + // do nothing + } + public function setOptions(array $options) : void + { + // do nothing + } + public function unsetOption(string $option) : void + { + // do nothing + } +} diff --git a/vendor/symfony/console/Formatter/OutputFormatter.php b/vendor/symfony/console/Formatter/OutputFormatter.php new file mode 100644 index 00000000..7b4c7fbe --- /dev/null +++ b/vendor/symfony/console/Formatter/OutputFormatter.php @@ -0,0 +1,241 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Formatter; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use function RuleDocGenerator202403\Symfony\Component\String\b; +/** + * Formatter class for console output. + * + * @author Konstantin Kudryashov + * @author Roland Franssen + */ +class OutputFormatter implements WrappableOutputFormatterInterface +{ + /** + * @var bool + */ + private $decorated; + /** + * @var mixed[] + */ + private $styles = []; + /** + * @var \Symfony\Component\Console\Formatter\OutputFormatterStyleStack + */ + private $styleStack; + public function __clone() + { + $this->styleStack = clone $this->styleStack; + foreach ($this->styles as $key => $value) { + $this->styles[$key] = clone $value; + } + } + /** + * Escapes "<" and ">" special chars in given text. + */ + public static function escape(string $text) : string + { + $text = \preg_replace('/([^\\\\]|^)([<>])/', '$1\\\\$2', $text); + return self::escapeTrailingBackslash($text); + } + /** + * Escapes trailing "\" in given text. + * + * @internal + */ + public static function escapeTrailingBackslash(string $text) : string + { + if (\substr_compare($text, '\\', -\strlen('\\')) === 0) { + $len = \strlen($text); + $text = \rtrim($text, '\\'); + $text = \str_replace("\x00", '', $text); + $text .= \str_repeat("\x00", $len - \strlen($text)); + } + return $text; + } + /** + * Initializes console output formatter. + * + * @param OutputFormatterStyleInterface[] $styles Array of "name => FormatterStyle" instances + */ + public function __construct(bool $decorated = \false, array $styles = []) + { + $this->decorated = $decorated; + $this->setStyle('error', new OutputFormatterStyle('white', 'red')); + $this->setStyle('info', new OutputFormatterStyle('green')); + $this->setStyle('comment', new OutputFormatterStyle('yellow')); + $this->setStyle('question', new OutputFormatterStyle('black', 'cyan')); + foreach ($styles as $name => $style) { + $this->setStyle($name, $style); + } + $this->styleStack = new OutputFormatterStyleStack(); + } + /** + * @return void + */ + public function setDecorated(bool $decorated) + { + $this->decorated = $decorated; + } + public function isDecorated() : bool + { + return $this->decorated; + } + /** + * @return void + */ + public function setStyle(string $name, OutputFormatterStyleInterface $style) + { + $this->styles[\strtolower($name)] = $style; + } + public function hasStyle(string $name) : bool + { + return isset($this->styles[\strtolower($name)]); + } + public function getStyle(string $name) : OutputFormatterStyleInterface + { + if (!$this->hasStyle($name)) { + throw new InvalidArgumentException(\sprintf('Undefined style: "%s".', $name)); + } + return $this->styles[\strtolower($name)]; + } + public function format(?string $message) : ?string + { + return $this->formatAndWrap($message, 0); + } + /** + * @return string + */ + public function formatAndWrap(?string $message, int $width) + { + if (null === $message) { + return ''; + } + $offset = 0; + $output = ''; + $openTagRegex = '[a-z](?:[^\\\\<>]*+ | \\\\.)*'; + $closeTagRegex = '[a-z][^<>]*+'; + $currentLineLength = 0; + \preg_match_all("#<(({$openTagRegex}) | /({$closeTagRegex})?)>#ix", $message, $matches, \PREG_OFFSET_CAPTURE); + foreach ($matches[0] as $i => $match) { + $pos = $match[1]; + $text = $match[0]; + if (0 != $pos && '\\' == $message[$pos - 1]) { + continue; + } + // add the text up to the next tag + $output .= $this->applyCurrentStyle(\substr($message, $offset, $pos - $offset), $output, $width, $currentLineLength); + $offset = $pos + \strlen($text); + // opening tag? + if ($open = '/' !== $text[1]) { + $tag = $matches[1][$i][0]; + } else { + $tag = $matches[3][$i][0] ?? ''; + } + if (!$open && !$tag) { + // + $this->styleStack->pop(); + } elseif (null === ($style = $this->createStyleFromString($tag))) { + $output .= $this->applyCurrentStyle($text, $output, $width, $currentLineLength); + } elseif ($open) { + $this->styleStack->push($style); + } else { + $this->styleStack->pop($style); + } + } + $output .= $this->applyCurrentStyle(\substr($message, $offset), $output, $width, $currentLineLength); + return \strtr($output, ["\x00" => '\\', '\\<' => '<', '\\>' => '>']); + } + public function getStyleStack() : OutputFormatterStyleStack + { + return $this->styleStack; + } + /** + * Tries to create new style instance from string. + */ + private function createStyleFromString(string $string) : ?OutputFormatterStyleInterface + { + if (isset($this->styles[$string])) { + return $this->styles[$string]; + } + if (!\preg_match_all('/([^=]+)=([^;]+)(;|$)/', $string, $matches, \PREG_SET_ORDER)) { + return null; + } + $style = new OutputFormatterStyle(); + foreach ($matches as $match) { + \array_shift($match); + $match[0] = \strtolower($match[0]); + if ('fg' == $match[0]) { + $style->setForeground(\strtolower($match[1])); + } elseif ('bg' == $match[0]) { + $style->setBackground(\strtolower($match[1])); + } elseif ('href' === $match[0]) { + $url = \preg_replace('{\\\\([<>])}', '$1', $match[1]); + $style->setHref($url); + } elseif ('options' === $match[0]) { + \preg_match_all('([^,;]+)', \strtolower($match[1]), $options); + $options = \array_shift($options); + foreach ($options as $option) { + $style->setOption($option); + } + } else { + return null; + } + } + return $style; + } + /** + * Applies current style from stack to text, if must be applied. + */ + private function applyCurrentStyle(string $text, string $current, int $width, int &$currentLineLength) : string + { + if ('' === $text) { + return ''; + } + if (!$width) { + return $this->isDecorated() ? $this->styleStack->getCurrent()->apply($text) : $text; + } + if (!$currentLineLength && '' !== $current) { + $text = \ltrim($text); + } + if ($currentLineLength) { + $prefix = \substr($text, 0, $i = $width - $currentLineLength) . "\n"; + $text = \substr($text, $i); + } else { + $prefix = ''; + } + \preg_match('~(\\n)$~', $text, $matches); + $text = $prefix . $this->addLineBreaks($text, $width); + $text = \rtrim($text, "\n") . ($matches[1] ?? ''); + if (!$currentLineLength && '' !== $current && \substr_compare($current, "\n", -\strlen("\n")) !== 0) { + $text = "\n" . $text; + } + $lines = \explode("\n", $text); + foreach ($lines as $line) { + $currentLineLength += \strlen($line); + if ($width <= $currentLineLength) { + $currentLineLength = 0; + } + } + if ($this->isDecorated()) { + foreach ($lines as $i => $line) { + $lines[$i] = $this->styleStack->getCurrent()->apply($line); + } + } + return \implode("\n", $lines); + } + private function addLineBreaks(string $text, int $width) : string + { + $encoding = \mb_detect_encoding($text, null, \true) ?: 'UTF-8'; + return b($text)->toCodePointString($encoding)->wordwrap($width, "\n", \true)->toByteString($encoding); + } +} diff --git a/vendor/symfony/console/Formatter/OutputFormatterInterface.php b/vendor/symfony/console/Formatter/OutputFormatterInterface.php new file mode 100644 index 00000000..2005ded8 --- /dev/null +++ b/vendor/symfony/console/Formatter/OutputFormatterInterface.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Formatter; + +/** + * Formatter interface for console output. + * + * @author Konstantin Kudryashov + */ +interface OutputFormatterInterface +{ + /** + * Sets the decorated flag. + * + * @return void + */ + public function setDecorated(bool $decorated); + /** + * Whether the output will decorate messages. + */ + public function isDecorated() : bool; + /** + * Sets a new style. + * + * @return void + */ + public function setStyle(string $name, OutputFormatterStyleInterface $style); + /** + * Checks if output formatter has style with specified name. + */ + public function hasStyle(string $name) : bool; + /** + * Gets style options from style with specified name. + * + * @throws \InvalidArgumentException When style isn't defined + */ + public function getStyle(string $name) : OutputFormatterStyleInterface; + /** + * Formats a message according to the given styles. + */ + public function format(?string $message) : ?string; +} diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyle.php b/vendor/symfony/console/Formatter/OutputFormatterStyle.php new file mode 100644 index 00000000..0209e2ac --- /dev/null +++ b/vendor/symfony/console/Formatter/OutputFormatterStyle.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Formatter; + +use RuleDocGenerator202403\Symfony\Component\Console\Color; +/** + * Formatter style class for defining styles. + * + * @author Konstantin Kudryashov + */ +class OutputFormatterStyle implements OutputFormatterStyleInterface +{ + /** + * @var \Symfony\Component\Console\Color + */ + private $color; + /** + * @var string + */ + private $foreground; + /** + * @var string + */ + private $background; + /** + * @var mixed[] + */ + private $options; + /** + * @var string|null + */ + private $href; + /** + * @var bool + */ + private $handlesHrefGracefully; + /** + * Initializes output formatter style. + * + * @param string|null $foreground The style foreground color name + * @param string|null $background The style background color name + */ + public function __construct(?string $foreground = null, ?string $background = null, array $options = []) + { + $this->color = new Color($this->foreground = $foreground ?: '', $this->background = $background ?: '', $this->options = $options); + } + /** + * @return void + */ + public function setForeground(?string $color = null) + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + $this->color = new Color($this->foreground = $color ?: '', $this->background, $this->options); + } + /** + * @return void + */ + public function setBackground(?string $color = null) + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + $this->color = new Color($this->foreground, $this->background = $color ?: '', $this->options); + } + public function setHref(string $url) : void + { + $this->href = $url; + } + /** + * @return void + */ + public function setOption(string $option) + { + $this->options[] = $option; + $this->color = new Color($this->foreground, $this->background, $this->options); + } + /** + * @return void + */ + public function unsetOption(string $option) + { + $pos = \array_search($option, $this->options); + if (\false !== $pos) { + unset($this->options[$pos]); + } + $this->color = new Color($this->foreground, $this->background, $this->options); + } + /** + * @return void + */ + public function setOptions(array $options) + { + $this->color = new Color($this->foreground, $this->background, $this->options = $options); + } + public function apply(string $text) : string + { + $this->handlesHrefGracefully = $this->handlesHrefGracefully ?? 'JetBrains-JediTerm' !== \getenv('TERMINAL_EMULATOR') && (!\getenv('KONSOLE_VERSION') || (int) \getenv('KONSOLE_VERSION') > 201100) && !isset($_SERVER['IDEA_INITIAL_DIRECTORY']); + if (null !== $this->href && $this->handlesHrefGracefully) { + $text = "\x1b]8;;{$this->href}\x1b\\{$text}\x1b]8;;\x1b\\"; + } + return $this->color->apply($text); + } +} diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php b/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php new file mode 100644 index 00000000..d3373240 --- /dev/null +++ b/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Formatter; + +/** + * Formatter style interface for defining styles. + * + * @author Konstantin Kudryashov + */ +interface OutputFormatterStyleInterface +{ + /** + * Sets style foreground color. + * + * @return void + */ + public function setForeground(?string $color); + /** + * Sets style background color. + * + * @return void + */ + public function setBackground(?string $color); + /** + * Sets some specific style option. + * + * @return void + */ + public function setOption(string $option); + /** + * Unsets some specific style option. + * + * @return void + */ + public function unsetOption(string $option); + /** + * Sets multiple style options at once. + * + * @return void + */ + public function setOptions(array $options); + /** + * Applies the style to a given text. + */ + public function apply(string $text) : string; +} diff --git a/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php new file mode 100644 index 00000000..849453be --- /dev/null +++ b/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php @@ -0,0 +1,94 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Formatter; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Contracts\Service\ResetInterface; +/** + * @author Jean-François Simon + */ +class OutputFormatterStyleStack implements ResetInterface +{ + /** + * @var OutputFormatterStyleInterface[] + */ + private $styles = []; + /** + * @var \Symfony\Component\Console\Formatter\OutputFormatterStyleInterface + */ + private $emptyStyle; + public function __construct(?OutputFormatterStyleInterface $emptyStyle = null) + { + $this->emptyStyle = $emptyStyle ?? new OutputFormatterStyle(); + $this->reset(); + } + /** + * Resets stack (ie. empty internal arrays). + * + * @return void + */ + public function reset() + { + $this->styles = []; + } + /** + * Pushes a style in the stack. + * + * @return void + */ + public function push(OutputFormatterStyleInterface $style) + { + $this->styles[] = $style; + } + /** + * Pops a style from the stack. + * + * @throws InvalidArgumentException When style tags incorrectly nested + */ + public function pop(?OutputFormatterStyleInterface $style = null) : OutputFormatterStyleInterface + { + if (!$this->styles) { + return $this->emptyStyle; + } + if (null === $style) { + return \array_pop($this->styles); + } + foreach (\array_reverse($this->styles, \true) as $index => $stackedStyle) { + if ($style->apply('') === $stackedStyle->apply('')) { + $this->styles = \array_slice($this->styles, 0, $index); + return $stackedStyle; + } + } + throw new InvalidArgumentException('Incorrectly nested style tag found.'); + } + /** + * Computes current style with stacks top codes. + */ + public function getCurrent() : OutputFormatterStyleInterface + { + if (!$this->styles) { + return $this->emptyStyle; + } + return $this->styles[\count($this->styles) - 1]; + } + /** + * @return $this + */ + public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle) + { + $this->emptyStyle = $emptyStyle; + return $this; + } + public function getEmptyStyle() : OutputFormatterStyleInterface + { + return $this->emptyStyle; + } +} diff --git a/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php b/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php new file mode 100644 index 00000000..5d3dee62 --- /dev/null +++ b/vendor/symfony/console/Formatter/WrappableOutputFormatterInterface.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Formatter; + +/** + * Formatter interface for console output that supports word wrapping. + * + * @author Roland Franssen + */ +interface WrappableOutputFormatterInterface extends OutputFormatterInterface +{ + /** + * Formats a message according to the given styles, wrapping at `$width` (0 means no wrapping). + * + * @return string + */ + public function formatAndWrap(?string $message, int $width); +} diff --git a/vendor/symfony/console/Helper/DebugFormatterHelper.php b/vendor/symfony/console/Helper/DebugFormatterHelper.php new file mode 100644 index 00000000..781a90bf --- /dev/null +++ b/vendor/symfony/console/Helper/DebugFormatterHelper.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +/** + * Helps outputting debug information when running an external program from a command. + * + * An external program can be a Process, an HTTP request, or anything else. + * + * @author Fabien Potencier + */ +class DebugFormatterHelper extends Helper +{ + private const COLORS = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'default']; + /** + * @var mixed[] + */ + private $started = []; + /** + * @var int + */ + private $count = -1; + /** + * Starts a debug formatting session. + */ + public function start(string $id, string $message, string $prefix = 'RUN') : string + { + $this->started[$id] = ['border' => ++$this->count % \count(self::COLORS)]; + return \sprintf("%s %s %s\n", $this->getBorder($id), $prefix, $message); + } + /** + * Adds progress to a formatting session. + */ + public function progress(string $id, string $buffer, bool $error = \false, string $prefix = 'OUT', string $errorPrefix = 'ERR') : string + { + $message = ''; + if ($error) { + if (isset($this->started[$id]['out'])) { + $message .= "\n"; + unset($this->started[$id]['out']); + } + if (!isset($this->started[$id]['err'])) { + $message .= \sprintf('%s %s ', $this->getBorder($id), $errorPrefix); + $this->started[$id]['err'] = \true; + } + $message .= \str_replace("\n", \sprintf("\n%s %s ", $this->getBorder($id), $errorPrefix), $buffer); + } else { + if (isset($this->started[$id]['err'])) { + $message .= "\n"; + unset($this->started[$id]['err']); + } + if (!isset($this->started[$id]['out'])) { + $message .= \sprintf('%s %s ', $this->getBorder($id), $prefix); + $this->started[$id]['out'] = \true; + } + $message .= \str_replace("\n", \sprintf("\n%s %s ", $this->getBorder($id), $prefix), $buffer); + } + return $message; + } + /** + * Stops a formatting session. + */ + public function stop(string $id, string $message, bool $successful, string $prefix = 'RES') : string + { + $trailingEOL = isset($this->started[$id]['out']) || isset($this->started[$id]['err']) ? "\n" : ''; + if ($successful) { + return \sprintf("%s%s %s %s\n", $trailingEOL, $this->getBorder($id), $prefix, $message); + } + $message = \sprintf("%s%s %s %s\n", $trailingEOL, $this->getBorder($id), $prefix, $message); + unset($this->started[$id]['out'], $this->started[$id]['err']); + return $message; + } + private function getBorder(string $id) : string + { + return \sprintf(' ', self::COLORS[$this->started[$id]['border']]); + } + public function getName() : string + { + return 'debug_formatter'; + } +} diff --git a/vendor/symfony/console/Helper/DescriptorHelper.php b/vendor/symfony/console/Helper/DescriptorHelper.php new file mode 100644 index 00000000..f536263d --- /dev/null +++ b/vendor/symfony/console/Helper/DescriptorHelper.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Descriptor\DescriptorInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Descriptor\JsonDescriptor; +use RuleDocGenerator202403\Symfony\Component\Console\Descriptor\MarkdownDescriptor; +use RuleDocGenerator202403\Symfony\Component\Console\Descriptor\ReStructuredTextDescriptor; +use RuleDocGenerator202403\Symfony\Component\Console\Descriptor\TextDescriptor; +use RuleDocGenerator202403\Symfony\Component\Console\Descriptor\XmlDescriptor; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * This class adds helper method to describe objects in various formats. + * + * @author Jean-François Simon + */ +class DescriptorHelper extends Helper +{ + /** + * @var DescriptorInterface[] + */ + private $descriptors = []; + public function __construct() + { + $this->register('txt', new TextDescriptor())->register('xml', new XmlDescriptor())->register('json', new JsonDescriptor())->register('md', new MarkdownDescriptor())->register('rst', new ReStructuredTextDescriptor()); + } + /** + * Describes an object if supported. + * + * Available options are: + * * format: string, the output format name + * * raw_text: boolean, sets output type as raw + * + * @return void + * + * @throws InvalidArgumentException when the given format is not supported + */ + public function describe(OutputInterface $output, ?object $object, array $options = []) + { + $options = \array_merge(['raw_text' => \false, 'format' => 'txt'], $options); + if (!isset($this->descriptors[$options['format']])) { + throw new InvalidArgumentException(\sprintf('Unsupported format "%s".', $options['format'])); + } + $descriptor = $this->descriptors[$options['format']]; + $descriptor->describe($output, $object, $options); + } + /** + * Registers a descriptor. + * + * @return $this + */ + public function register(string $format, DescriptorInterface $descriptor) + { + $this->descriptors[$format] = $descriptor; + return $this; + } + public function getName() : string + { + return 'descriptor'; + } + public function getFormats() : array + { + return \array_keys($this->descriptors); + } +} diff --git a/vendor/symfony/console/Helper/Dumper.php b/vendor/symfony/console/Helper/Dumper.php new file mode 100644 index 00000000..c2a7062e --- /dev/null +++ b/vendor/symfony/console/Helper/Dumper.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\VarDumper\Cloner\ClonerInterface; +use RuleDocGenerator202403\Symfony\Component\VarDumper\Cloner\VarCloner; +use RuleDocGenerator202403\Symfony\Component\VarDumper\Dumper\CliDumper; +/** + * @author Roland Franssen + */ +final class Dumper +{ + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $output; + /** + * @var \Symfony\Component\VarDumper\Dumper\CliDumper|null + */ + private $dumper; + /** + * @var \Symfony\Component\VarDumper\Cloner\ClonerInterface|null + */ + private $cloner; + /** + * @var \Closure + */ + private $handler; + public function __construct(OutputInterface $output, ?CliDumper $dumper = null, ?ClonerInterface $cloner = null) + { + $this->output = $output; + $this->dumper = $dumper; + $this->cloner = $cloner; + if (\class_exists(CliDumper::class)) { + $this->handler = function ($var) : string { + $dumper = $this->dumper = $this->dumper ?? new CliDumper(null, null, CliDumper::DUMP_LIGHT_ARRAY | CliDumper::DUMP_COMMA_SEPARATOR); + $dumper->setColors($this->output->isDecorated()); + return \rtrim($dumper->dump(($this->cloner = $this->cloner ?? new VarCloner())->cloneVar($var)->withRefHandles(\false), \true)); + }; + } else { + $this->handler = function ($var) : string { + switch (\true) { + case null === $var: + return 'null'; + case \true === $var: + return 'true'; + case \false === $var: + return 'false'; + case \is_string($var): + return '"' . $var . '"'; + default: + return \rtrim(\print_r($var, \true)); + } + }; + } + } + /** + * @param mixed $var + */ + public function __invoke($var) : string + { + return ($this->handler)($var); + } +} diff --git a/vendor/symfony/console/Helper/FormatterHelper.php b/vendor/symfony/console/Helper/FormatterHelper.php new file mode 100644 index 00000000..0d05f5ca --- /dev/null +++ b/vendor/symfony/console/Helper/FormatterHelper.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatter; +/** + * The Formatter class provides helpers to format messages. + * + * @author Fabien Potencier + */ +class FormatterHelper extends Helper +{ + /** + * Formats a message within a section. + */ + public function formatSection(string $section, string $message, string $style = 'info') : string + { + return \sprintf('<%s>[%s] %s', $style, $section, $style, $message); + } + /** + * Formats a message as a block of text. + * @param string|mixed[] $messages + */ + public function formatBlock($messages, string $style, bool $large = \false) : string + { + if (!\is_array($messages)) { + $messages = [$messages]; + } + $len = 0; + $lines = []; + foreach ($messages as $message) { + $message = OutputFormatter::escape($message); + $lines[] = \sprintf($large ? ' %s ' : ' %s ', $message); + $len = \max(self::width($message) + ($large ? 4 : 2), $len); + } + $messages = $large ? [\str_repeat(' ', $len)] : []; + for ($i = 0; isset($lines[$i]); ++$i) { + $messages[] = $lines[$i] . \str_repeat(' ', $len - self::width($lines[$i])); + } + if ($large) { + $messages[] = \str_repeat(' ', $len); + } + for ($i = 0; isset($messages[$i]); ++$i) { + $messages[$i] = \sprintf('<%s>%s', $style, $messages[$i], $style); + } + return \implode("\n", $messages); + } + /** + * Truncates a message to the given length. + */ + public function truncate(string $message, int $length, string $suffix = '...') : string + { + $computedLength = $length - self::width($suffix); + if ($computedLength > self::width($message)) { + return $message; + } + return self::substr($message, 0, $length) . $suffix; + } + public function getName() : string + { + return 'formatter'; + } +} diff --git a/vendor/symfony/console/Helper/Helper.php b/vendor/symfony/console/Helper/Helper.php new file mode 100644 index 00000000..9962608f --- /dev/null +++ b/vendor/symfony/console/Helper/Helper.php @@ -0,0 +1,139 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RuleDocGenerator202403\Symfony\Component\String\UnicodeString; +/** + * Helper is the base class for all helper classes. + * + * @author Fabien Potencier + */ +abstract class Helper implements HelperInterface +{ + protected $helperSet; + /** + * @return void + */ + public function setHelperSet(?HelperSet $helperSet = null) + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + $this->helperSet = $helperSet; + } + public function getHelperSet() : ?HelperSet + { + return $this->helperSet; + } + /** + * Returns the width of a string, using mb_strwidth if it is available. + * The width is how many characters positions the string will use. + */ + public static function width(?string $string) : int + { + $string = $string ?? ''; + if (\preg_match('//u', $string)) { + return (new UnicodeString($string))->width(\false); + } + if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) { + return \strlen($string); + } + return \mb_strwidth($string, $encoding); + } + /** + * Returns the length of a string, using mb_strlen if it is available. + * The length is related to how many bytes the string will use. + */ + public static function length(?string $string) : int + { + $string = $string ?? ''; + if (\preg_match('//u', $string)) { + return (new UnicodeString($string))->length(); + } + if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) { + return \strlen($string); + } + return \mb_strlen($string, $encoding); + } + /** + * Returns the subset of a string, using mb_substr if it is available. + */ + public static function substr(?string $string, int $from, ?int $length = null) : string + { + $string = $string ?? ''; + if (\false === ($encoding = \mb_detect_encoding($string, null, \true))) { + return \substr($string, $from, $length); + } + return \mb_substr($string, $from, $length, $encoding); + } + /** + * @return string + * @param int|float $secs + */ + public static function formatTime($secs, int $precision = 1) + { + $secs = (int) \floor($secs); + if (0 === $secs) { + return '< 1 sec'; + } + static $timeFormats = [[1, '1 sec', 'secs'], [60, '1 min', 'mins'], [3600, '1 hr', 'hrs'], [86400, '1 day', 'days']]; + $times = []; + foreach ($timeFormats as $index => $format) { + $seconds = isset($timeFormats[$index + 1]) ? $secs % $timeFormats[$index + 1][0] : $secs; + if (isset($times[$index - $precision])) { + unset($times[$index - $precision]); + } + if (0 === $seconds) { + continue; + } + $unitCount = $seconds / $format[0]; + $times[$index] = 1 === $unitCount ? $format[1] : $unitCount . ' ' . $format[2]; + if ($secs === $seconds) { + break; + } + $secs -= $seconds; + } + return \implode(', ', \array_reverse($times)); + } + /** + * @return string + */ + public static function formatMemory(int $memory) + { + if ($memory >= 1024 * 1024 * 1024) { + return \sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024); + } + if ($memory >= 1024 * 1024) { + return \sprintf('%.1f MiB', $memory / 1024 / 1024); + } + if ($memory >= 1024) { + return \sprintf('%d KiB', $memory / 1024); + } + return \sprintf('%d B', $memory); + } + /** + * @return string + */ + public static function removeDecoration(OutputFormatterInterface $formatter, ?string $string) + { + $isDecorated = $formatter->isDecorated(); + $formatter->setDecorated(\false); + // remove <...> formatting + $string = $formatter->format($string ?? ''); + // remove already formatted characters + $string = \preg_replace("/\x1b\\[[^m]*m/", '', $string ?? ''); + // remove terminal hyperlinks + $string = \preg_replace('/\\033]8;[^;]*;[^\\033]*\\033\\\\/', '', $string ?? ''); + $formatter->setDecorated($isDecorated); + return $string; + } +} diff --git a/vendor/symfony/console/Helper/HelperInterface.php b/vendor/symfony/console/Helper/HelperInterface.php new file mode 100644 index 00000000..6ee4d505 --- /dev/null +++ b/vendor/symfony/console/Helper/HelperInterface.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +/** + * HelperInterface is the interface all helpers must implement. + * + * @author Fabien Potencier + */ +interface HelperInterface +{ + /** + * Sets the helper set associated with this helper. + * + * @return void + */ + public function setHelperSet(?HelperSet $helperSet); + /** + * Gets the helper set associated with this helper. + */ + public function getHelperSet() : ?HelperSet; + /** + * Returns the canonical name of this helper. + * + * @return string + */ + public function getName(); +} diff --git a/vendor/symfony/console/Helper/HelperSet.php b/vendor/symfony/console/Helper/HelperSet.php new file mode 100644 index 00000000..f013a7ae --- /dev/null +++ b/vendor/symfony/console/Helper/HelperSet.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +/** + * HelperSet represents a set of helpers to be used with a command. + * + * @author Fabien Potencier + * + * @implements \IteratorAggregate + */ +class HelperSet implements \IteratorAggregate +{ + /** @var array */ + private $helpers = []; + /** + * @param HelperInterface[] $helpers + */ + public function __construct(array $helpers = []) + { + foreach ($helpers as $alias => $helper) { + $this->set($helper, \is_int($alias) ? null : $alias); + } + } + /** + * @return void + */ + public function set(HelperInterface $helper, ?string $alias = null) + { + $this->helpers[$helper->getName()] = $helper; + if (null !== $alias) { + $this->helpers[$alias] = $helper; + } + $helper->setHelperSet($this); + } + /** + * Returns true if the helper if defined. + */ + public function has(string $name) : bool + { + return isset($this->helpers[$name]); + } + /** + * Gets a helper value. + * + * @throws InvalidArgumentException if the helper is not defined + */ + public function get(string $name) : HelperInterface + { + if (!$this->has($name)) { + throw new InvalidArgumentException(\sprintf('The helper "%s" is not defined.', $name)); + } + return $this->helpers[$name]; + } + public function getIterator() : \Traversable + { + return new \ArrayIterator($this->helpers); + } +} diff --git a/vendor/symfony/console/Helper/InputAwareHelper.php b/vendor/symfony/console/Helper/InputAwareHelper.php new file mode 100644 index 00000000..e787d80d --- /dev/null +++ b/vendor/symfony/console/Helper/InputAwareHelper.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputAwareInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +/** + * An implementation of InputAwareInterface for Helpers. + * + * @author Wouter J + */ +abstract class InputAwareHelper extends Helper implements InputAwareInterface +{ + protected $input; + /** + * @return void + */ + public function setInput(InputInterface $input) + { + $this->input = $input; + } +} diff --git a/vendor/symfony/console/Helper/OutputWrapper.php b/vendor/symfony/console/Helper/OutputWrapper.php new file mode 100644 index 00000000..21b399ee --- /dev/null +++ b/vendor/symfony/console/Helper/OutputWrapper.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +/** + * Simple output wrapper for "tagged outputs" instead of wordwrap(). This solution is based on a StackOverflow + * answer: https://stackoverflow.com/a/20434776/1476819 from user557597 (alias SLN). + * + * (?: + * # -- Words/Characters + * ( # (1 start) + * (?> # Atomic Group - Match words with valid breaks + * .{1,16} # 1-N characters + * # Followed by one of 4 prioritized, non-linebreak whitespace + * (?: # break types: + * (?<= [^\S\r\n] ) # 1. - Behind a non-linebreak whitespace + * [^\S\r\n]? # ( optionally accept an extra non-linebreak whitespace ) + * | (?= \r? \n ) # 2. - Ahead a linebreak + * | $ # 3. - EOS + * | [^\S\r\n] # 4. - Accept an extra non-linebreak whitespace + * ) + * ) # End atomic group + * | + * .{1,16} # No valid word breaks, just break on the N'th character + * ) # (1 end) + * (?: \r? \n )? # Optional linebreak after Words/Characters + * | + * # -- Or, Linebreak + * (?: \r? \n | $ ) # Stand alone linebreak or at EOS + * ) + * + * @author Krisztián Ferenczi + * + * @see https://stackoverflow.com/a/20434776/1476819 + */ +final class OutputWrapper +{ + /** + * @var bool + */ + private $allowCutUrls = \false; + private const TAG_OPEN_REGEX_SEGMENT = '[a-z](?:[^\\\\<>]*+ | \\\\.)*'; + private const TAG_CLOSE_REGEX_SEGMENT = '[a-z][^<>]*+'; + private const URL_PATTERN = 'https?://\\S+'; + public function __construct(bool $allowCutUrls = \false) + { + $this->allowCutUrls = $allowCutUrls; + } + public function wrap(string $text, int $width, string $break = "\n") : string + { + if (!$width) { + return $text; + } + $tagPattern = \sprintf('<(?:(?:%s)|/(?:%s)?)>', self::TAG_OPEN_REGEX_SEGMENT, self::TAG_CLOSE_REGEX_SEGMENT); + $limitPattern = "{1,{$width}}"; + $patternBlocks = [$tagPattern]; + if (!$this->allowCutUrls) { + $patternBlocks[] = self::URL_PATTERN; + } + $patternBlocks[] = '.'; + $blocks = \implode('|', $patternBlocks); + $rowPattern = "(?:{$blocks}){$limitPattern}"; + $pattern = \sprintf('#(?:((?>(%1$s)((?<=[^\\S\\r\\n])[^\\S\\r\\n]?|(?=\\r?\\n)|$|[^\\S\\r\\n]))|(%1$s))(?:\\r?\\n)?|(?:\\r?\\n|$))#imux', $rowPattern); + $output = \rtrim(\preg_replace($pattern, '\\1' . $break, $text), $break); + return \str_replace(' ' . $break, $break, $output); + } +} diff --git a/vendor/symfony/console/Helper/ProcessHelper.php b/vendor/symfony/console/Helper/ProcessHelper.php new file mode 100644 index 00000000..f5fe7f0e --- /dev/null +++ b/vendor/symfony/console/Helper/ProcessHelper.php @@ -0,0 +1,116 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Process\Exception\ProcessFailedException; +use RuleDocGenerator202403\Symfony\Component\Process\Process; +/** + * The ProcessHelper class provides helpers to run external processes. + * + * @author Fabien Potencier + * + * @final + */ +class ProcessHelper extends Helper +{ + /** + * Runs an external process. + * + * @param array|Process $cmd An instance of Process or an array of the command and arguments + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + */ + public function run(OutputInterface $output, $cmd, ?string $error = null, ?callable $callback = null, int $verbosity = OutputInterface::VERBOSITY_VERY_VERBOSE) : Process + { + if (!\class_exists(Process::class)) { + throw new \LogicException('The ProcessHelper cannot be run as the Process component is not installed. Try running "compose require symfony/process".'); + } + if ($output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + $formatter = $this->getHelperSet()->get('debug_formatter'); + if ($cmd instanceof Process) { + $cmd = [$cmd]; + } + if (\is_string($cmd[0] ?? null)) { + $process = new Process($cmd); + $cmd = []; + } elseif (($cmd[0] ?? null) instanceof Process) { + $process = $cmd[0]; + unset($cmd[0]); + } else { + throw new \InvalidArgumentException(\sprintf('Invalid command provided to "%s()": the command should be an array whose first element is either the path to the binary to run or a "Process" object.', __METHOD__)); + } + if ($verbosity <= $output->getVerbosity()) { + $output->write($formatter->start(\spl_object_hash($process), $this->escapeString($process->getCommandLine()))); + } + if ($output->isDebug()) { + $callback = $this->wrapCallback($output, $process, $callback); + } + $process->run($callback, $cmd); + if ($verbosity <= $output->getVerbosity()) { + $message = $process->isSuccessful() ? 'Command ran successfully' : \sprintf('%s Command did not run successfully', $process->getExitCode()); + $output->write($formatter->stop(\spl_object_hash($process), $message, $process->isSuccessful())); + } + if (!$process->isSuccessful() && null !== $error) { + $output->writeln(\sprintf('%s', $this->escapeString($error))); + } + return $process; + } + /** + * Runs the process. + * + * This is identical to run() except that an exception is thrown if the process + * exits with a non-zero exit code. + * + * @param array|Process $cmd An instance of Process or a command to run + * @param callable|null $callback A PHP callback to run whenever there is some + * output available on STDOUT or STDERR + * + * @throws ProcessFailedException + * + * @see run() + */ + public function mustRun(OutputInterface $output, $cmd, ?string $error = null, ?callable $callback = null) : Process + { + $process = $this->run($output, $cmd, $error, $callback); + if (!$process->isSuccessful()) { + throw new ProcessFailedException($process); + } + return $process; + } + /** + * Wraps a Process callback to add debugging output. + */ + public function wrapCallback(OutputInterface $output, Process $process, ?callable $callback = null) : callable + { + if ($output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + $formatter = $this->getHelperSet()->get('debug_formatter'); + return function ($type, $buffer) use($output, $process, $callback, $formatter) { + $output->write($formatter->progress(\spl_object_hash($process), $this->escapeString($buffer), Process::ERR === $type)); + if (null !== $callback) { + $callback($type, $buffer); + } + }; + } + private function escapeString(string $str) : string + { + return \str_replace('<', '\\<', $str); + } + public function getName() : string + { + return 'process'; + } +} diff --git a/vendor/symfony/console/Helper/ProgressBar.php b/vendor/symfony/console/Helper/ProgressBar.php new file mode 100644 index 00000000..167e108a --- /dev/null +++ b/vendor/symfony/console/Helper/ProgressBar.php @@ -0,0 +1,597 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Cursor; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\LogicException; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Terminal; +/** + * The ProgressBar provides helpers to display progress output. + * + * @author Fabien Potencier + * @author Chris Jones + */ +final class ProgressBar +{ + public const FORMAT_VERBOSE = 'verbose'; + public const FORMAT_VERY_VERBOSE = 'very_verbose'; + public const FORMAT_DEBUG = 'debug'; + public const FORMAT_NORMAL = 'normal'; + private const FORMAT_VERBOSE_NOMAX = 'verbose_nomax'; + private const FORMAT_VERY_VERBOSE_NOMAX = 'very_verbose_nomax'; + private const FORMAT_DEBUG_NOMAX = 'debug_nomax'; + private const FORMAT_NORMAL_NOMAX = 'normal_nomax'; + /** + * @var int + */ + private $barWidth = 28; + /** + * @var string + */ + private $barChar; + /** + * @var string + */ + private $emptyBarChar = '-'; + /** + * @var string + */ + private $progressChar = '>'; + /** + * @var string|null + */ + private $format; + /** + * @var string|null + */ + private $internalFormat; + /** + * @var int|null + */ + private $redrawFreq = 1; + /** + * @var int + */ + private $writeCount = 0; + /** + * @var float + */ + private $lastWriteTime = 0; + /** + * @var float + */ + private $minSecondsBetweenRedraws = 0; + /** + * @var float + */ + private $maxSecondsBetweenRedraws = 1; + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $output; + /** + * @var int + */ + private $step = 0; + /** + * @var int + */ + private $startingStep = 0; + /** + * @var int|null + */ + private $max; + /** + * @var int + */ + private $startTime; + /** + * @var int + */ + private $stepWidth; + /** + * @var float + */ + private $percent = 0.0; + /** + * @var mixed[] + */ + private $messages = []; + /** + * @var bool + */ + private $overwrite = \true; + /** + * @var \Symfony\Component\Console\Terminal + */ + private $terminal; + /** + * @var string|null + */ + private $previousMessage; + /** + * @var \Symfony\Component\Console\Cursor + */ + private $cursor; + /** + * @var mixed[] + */ + private $placeholders = []; + /** + * @var mixed[] + */ + private static $formatters; + /** + * @var mixed[] + */ + private static $formats; + /** + * @param int $max Maximum steps (0 if unknown) + */ + public function __construct(OutputInterface $output, int $max = 0, float $minSecondsBetweenRedraws = 1 / 25) + { + if ($output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + $this->output = $output; + $this->setMaxSteps($max); + $this->terminal = new Terminal(); + if (0 < $minSecondsBetweenRedraws) { + $this->redrawFreq = null; + $this->minSecondsBetweenRedraws = $minSecondsBetweenRedraws; + } + if (!$this->output->isDecorated()) { + // disable overwrite when output does not support ANSI codes. + $this->overwrite = \false; + // set a reasonable redraw frequency so output isn't flooded + $this->redrawFreq = null; + } + $this->startTime = \time(); + $this->cursor = new Cursor($output); + } + /** + * Sets a placeholder formatter for a given name, globally for all instances of ProgressBar. + * + * This method also allow you to override an existing placeholder. + * + * @param string $name The placeholder name (including the delimiter char like %) + * @param callable(ProgressBar):string $callable A PHP callable + */ + public static function setPlaceholderFormatterDefinition(string $name, callable $callable) : void + { + self::$formatters = self::$formatters ?? self::initPlaceholderFormatters(); + self::$formatters[$name] = $callable; + } + /** + * Gets the placeholder formatter for a given name. + * + * @param string $name The placeholder name (including the delimiter char like %) + */ + public static function getPlaceholderFormatterDefinition(string $name) : ?callable + { + self::$formatters = self::$formatters ?? self::initPlaceholderFormatters(); + return self::$formatters[$name] ?? null; + } + /** + * Sets a placeholder formatter for a given name, for this instance only. + * + * @param callable(ProgressBar):string $callable A PHP callable + */ + public function setPlaceholderFormatter(string $name, callable $callable) : void + { + $this->placeholders[$name] = $callable; + } + /** + * Gets the placeholder formatter for a given name. + * + * @param string $name The placeholder name (including the delimiter char like %) + */ + public function getPlaceholderFormatter(string $name) : ?callable + { + return $this->placeholders[$name] ?? $this::getPlaceholderFormatterDefinition($name); + } + /** + * Sets a format for a given name. + * + * This method also allow you to override an existing format. + * + * @param string $name The format name + * @param string $format A format string + */ + public static function setFormatDefinition(string $name, string $format) : void + { + self::$formats = self::$formats ?? self::initFormats(); + self::$formats[$name] = $format; + } + /** + * Gets the format for a given name. + * + * @param string $name The format name + */ + public static function getFormatDefinition(string $name) : ?string + { + self::$formats = self::$formats ?? self::initFormats(); + return self::$formats[$name] ?? null; + } + /** + * Associates a text with a named placeholder. + * + * The text is displayed when the progress bar is rendered but only + * when the corresponding placeholder is part of the custom format line + * (by wrapping the name with %). + * + * @param string $message The text to associate with the placeholder + * @param string $name The name of the placeholder + */ + public function setMessage(string $message, string $name = 'message') : void + { + $this->messages[$name] = $message; + } + public function getMessage(string $name = 'message') : string + { + return $this->messages[$name]; + } + public function getStartTime() : int + { + return $this->startTime; + } + public function getMaxSteps() : int + { + return $this->max; + } + public function getProgress() : int + { + return $this->step; + } + private function getStepWidth() : int + { + return $this->stepWidth; + } + public function getProgressPercent() : float + { + return $this->percent; + } + public function getBarOffset() : float + { + return \floor($this->max ? $this->percent * $this->barWidth : (null === $this->redrawFreq ? (int) (\min(5, $this->barWidth / 15) * $this->writeCount) : $this->step) % $this->barWidth); + } + public function getEstimated() : float + { + if (0 === $this->step || $this->step === $this->startingStep) { + return 0; + } + return \round((\time() - $this->startTime) / ($this->step - $this->startingStep) * $this->max); + } + public function getRemaining() : float + { + if (!$this->step) { + return 0; + } + return \round((\time() - $this->startTime) / ($this->step - $this->startingStep) * ($this->max - $this->step)); + } + public function setBarWidth(int $size) : void + { + $this->barWidth = \max(1, $size); + } + public function getBarWidth() : int + { + return $this->barWidth; + } + public function setBarCharacter(string $char) : void + { + $this->barChar = $char; + } + public function getBarCharacter() : string + { + return $this->barChar ?? ($this->max ? '=' : $this->emptyBarChar); + } + public function setEmptyBarCharacter(string $char) : void + { + $this->emptyBarChar = $char; + } + public function getEmptyBarCharacter() : string + { + return $this->emptyBarChar; + } + public function setProgressCharacter(string $char) : void + { + $this->progressChar = $char; + } + public function getProgressCharacter() : string + { + return $this->progressChar; + } + public function setFormat(string $format) : void + { + $this->format = null; + $this->internalFormat = $format; + } + /** + * Sets the redraw frequency. + * + * @param int|null $freq The frequency in steps + */ + public function setRedrawFrequency(?int $freq) : void + { + $this->redrawFreq = null !== $freq ? \max(1, $freq) : null; + } + public function minSecondsBetweenRedraws(float $seconds) : void + { + $this->minSecondsBetweenRedraws = $seconds; + } + public function maxSecondsBetweenRedraws(float $seconds) : void + { + $this->maxSecondsBetweenRedraws = $seconds; + } + /** + * Returns an iterator that will automatically update the progress bar when iterated. + * + * @template TKey + * @template TValue + * + * @param iterable $iterable + * @param int|null $max Number of steps to complete the bar (0 if indeterminate), if null it will be inferred from $iterable + * + * @return iterable + */ + public function iterate(iterable $iterable, ?int $max = null) : iterable + { + $this->start($max ?? (\is_array($iterable) || $iterable instanceof \Countable ? \count($iterable) : 0)); + foreach ($iterable as $key => $value) { + (yield $key => $value); + $this->advance(); + } + $this->finish(); + } + /** + * Starts the progress output. + * + * @param int|null $max Number of steps to complete the bar (0 if indeterminate), null to leave unchanged + * @param int $startAt The starting point of the bar (useful e.g. when resuming a previously started bar) + */ + public function start(?int $max = null, int $startAt = 0) : void + { + $this->startTime = \time(); + $this->step = $startAt; + $this->startingStep = $startAt; + $startAt > 0 ? $this->setProgress($startAt) : ($this->percent = 0.0); + if (null !== $max) { + $this->setMaxSteps($max); + } + $this->display(); + } + /** + * Advances the progress output X steps. + * + * @param int $step Number of steps to advance + */ + public function advance(int $step = 1) : void + { + $this->setProgress($this->step + $step); + } + /** + * Sets whether to overwrite the progressbar, false for new line. + */ + public function setOverwrite(bool $overwrite) : void + { + $this->overwrite = $overwrite; + } + public function setProgress(int $step) : void + { + if ($this->max && $step > $this->max) { + $this->max = $step; + } elseif ($step < 0) { + $step = 0; + } + $redrawFreq = $this->redrawFreq ?? ($this->max ?: 10) / 10; + $prevPeriod = (int) ($this->step / $redrawFreq); + $currPeriod = (int) ($step / $redrawFreq); + $this->step = $step; + $this->percent = $this->max ? (float) $this->step / $this->max : 0; + $timeInterval = \microtime(\true) - $this->lastWriteTime; + // Draw regardless of other limits + if ($this->max === $step) { + $this->display(); + return; + } + // Throttling + if ($timeInterval < $this->minSecondsBetweenRedraws) { + return; + } + // Draw each step period, but not too late + if ($prevPeriod !== $currPeriod || $timeInterval >= $this->maxSecondsBetweenRedraws) { + $this->display(); + } + } + public function setMaxSteps(int $max) : void + { + $this->format = null; + $this->max = \max(0, $max); + $this->stepWidth = $this->max ? Helper::width((string) $this->max) : 4; + } + /** + * Finishes the progress output. + */ + public function finish() : void + { + if (!$this->max) { + $this->max = $this->step; + } + if ($this->step === $this->max && !$this->overwrite) { + // prevent double 100% output + return; + } + $this->setProgress($this->max); + } + /** + * Outputs the current progress string. + */ + public function display() : void + { + if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { + return; + } + if (null === $this->format) { + $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); + } + $this->overwrite($this->buildLine()); + } + /** + * Removes the progress bar from the current line. + * + * This is useful if you wish to write some output + * while a progress bar is running. + * Call display() to show the progress bar again. + */ + public function clear() : void + { + if (!$this->overwrite) { + return; + } + if (null === $this->format) { + $this->setRealFormat($this->internalFormat ?: $this->determineBestFormat()); + } + $this->overwrite(''); + } + private function setRealFormat(string $format) : void + { + // try to use the _nomax variant if available + if (!$this->max && null !== self::getFormatDefinition($format . '_nomax')) { + $this->format = self::getFormatDefinition($format . '_nomax'); + } elseif (null !== self::getFormatDefinition($format)) { + $this->format = self::getFormatDefinition($format); + } else { + $this->format = $format; + } + } + /** + * Overwrites a previous message to the output. + */ + private function overwrite(string $message) : void + { + if ($this->previousMessage === $message) { + return; + } + $originalMessage = $message; + if ($this->overwrite) { + if (null !== $this->previousMessage) { + if ($this->output instanceof ConsoleSectionOutput) { + $messageLines = \explode("\n", $this->previousMessage); + $lineCount = \count($messageLines); + foreach ($messageLines as $messageLine) { + $messageLineLength = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $messageLine)); + if ($messageLineLength > $this->terminal->getWidth()) { + $lineCount += \floor($messageLineLength / $this->terminal->getWidth()); + } + } + $this->output->clear($lineCount); + } else { + $lineCount = \substr_count($this->previousMessage, "\n"); + for ($i = 0; $i < $lineCount; ++$i) { + $this->cursor->moveToColumn(1); + $this->cursor->clearLine(); + $this->cursor->moveUp(); + } + $this->cursor->moveToColumn(1); + $this->cursor->clearLine(); + } + } + } elseif ($this->step > 0) { + $message = \PHP_EOL . $message; + } + $this->previousMessage = $originalMessage; + $this->lastWriteTime = \microtime(\true); + $this->output->write($message); + ++$this->writeCount; + } + private function determineBestFormat() : string + { + switch ($this->output->getVerbosity()) { + case OutputInterface::VERBOSITY_VERBOSE: + return $this->max ? self::FORMAT_VERBOSE : self::FORMAT_VERBOSE_NOMAX; + case OutputInterface::VERBOSITY_VERY_VERBOSE: + return $this->max ? self::FORMAT_VERY_VERBOSE : self::FORMAT_VERY_VERBOSE_NOMAX; + case OutputInterface::VERBOSITY_DEBUG: + return $this->max ? self::FORMAT_DEBUG : self::FORMAT_DEBUG_NOMAX; + default: + return $this->max ? self::FORMAT_NORMAL : self::FORMAT_NORMAL_NOMAX; + } + } + private static function initPlaceholderFormatters() : array + { + return ['bar' => function (self $bar, OutputInterface $output) { + $completeBars = $bar->getBarOffset(); + $display = \str_repeat($bar->getBarCharacter(), $completeBars); + if ($completeBars < $bar->getBarWidth()) { + $emptyBars = $bar->getBarWidth() - $completeBars - Helper::length(Helper::removeDecoration($output->getFormatter(), $bar->getProgressCharacter())); + $display .= $bar->getProgressCharacter() . \str_repeat($bar->getEmptyBarCharacter(), $emptyBars); + } + return $display; + }, 'elapsed' => function (self $bar) { + return Helper::formatTime(\time() - $bar->getStartTime(), 2); + }, 'remaining' => function (self $bar) { + if (!$bar->getMaxSteps()) { + throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.'); + } + return Helper::formatTime($bar->getRemaining(), 2); + }, 'estimated' => function (self $bar) { + if (!$bar->getMaxSteps()) { + throw new LogicException('Unable to display the estimated time if the maximum number of steps is not set.'); + } + return Helper::formatTime($bar->getEstimated(), 2); + }, 'memory' => function (self $bar) { + return Helper::formatMemory(\memory_get_usage(\true)); + }, 'current' => function (self $bar) { + return \str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \STR_PAD_LEFT); + }, 'max' => function (self $bar) { + return $bar->getMaxSteps(); + }, 'percent' => function (self $bar) { + return \floor($bar->getProgressPercent() * 100); + }]; + } + private static function initFormats() : array + { + return [self::FORMAT_NORMAL => ' %current%/%max% [%bar%] %percent:3s%%', self::FORMAT_NORMAL_NOMAX => ' %current% [%bar%]', self::FORMAT_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%', self::FORMAT_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%', self::FORMAT_VERY_VERBOSE => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%', self::FORMAT_VERY_VERBOSE_NOMAX => ' %current% [%bar%] %elapsed:6s%', self::FORMAT_DEBUG => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%', self::FORMAT_DEBUG_NOMAX => ' %current% [%bar%] %elapsed:6s% %memory:6s%']; + } + private function buildLine() : string + { + \assert(null !== $this->format); + $regex = "{%([a-z\\-_]+)(?:\\:([^%]+))?%}i"; + $callback = function ($matches) { + if ($formatter = $this->getPlaceholderFormatter($matches[1])) { + $text = $formatter($this, $this->output); + } elseif (isset($this->messages[$matches[1]])) { + $text = $this->messages[$matches[1]]; + } else { + return $matches[0]; + } + if (isset($matches[2])) { + $text = \sprintf('%' . $matches[2], $text); + } + return $text; + }; + $line = \preg_replace_callback($regex, $callback, $this->format); + // gets string length for each sub line with multiline format + $linesLength = \array_map(function ($subLine) { + return Helper::width(Helper::removeDecoration($this->output->getFormatter(), \rtrim($subLine, "\r"))); + }, \explode("\n", $line)); + $linesWidth = \max($linesLength); + $terminalWidth = $this->terminal->getWidth(); + if ($linesWidth <= $terminalWidth) { + return $line; + } + $this->setBarWidth($this->barWidth - $linesWidth + $terminalWidth); + return \preg_replace_callback($regex, $callback, $this->format); + } +} diff --git a/vendor/symfony/console/Helper/ProgressIndicator.php b/vendor/symfony/console/Helper/ProgressIndicator.php new file mode 100644 index 00000000..9065faa6 --- /dev/null +++ b/vendor/symfony/console/Helper/ProgressIndicator.php @@ -0,0 +1,225 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\LogicException; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * @author Kevin Bond + */ +class ProgressIndicator +{ + private const FORMATS = ['normal' => ' %indicator% %message%', 'normal_no_ansi' => ' %message%', 'verbose' => ' %indicator% %message% (%elapsed:6s%)', 'verbose_no_ansi' => ' %message% (%elapsed:6s%)', 'very_verbose' => ' %indicator% %message% (%elapsed:6s%, %memory:6s%)', 'very_verbose_no_ansi' => ' %message% (%elapsed:6s%, %memory:6s%)']; + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $output; + /** + * @var int + */ + private $startTime; + /** + * @var string|null + */ + private $format; + /** + * @var string|null + */ + private $message; + /** + * @var mixed[] + */ + private $indicatorValues; + /** + * @var int + */ + private $indicatorCurrent; + /** + * @var int + */ + private $indicatorChangeInterval; + /** + * @var float + */ + private $indicatorUpdateTime; + /** + * @var bool + */ + private $started = \false; + /** + * @var array + */ + private static $formatters; + /** + * @param int $indicatorChangeInterval Change interval in milliseconds + * @param array|null $indicatorValues Animated indicator characters + */ + public function __construct(OutputInterface $output, ?string $format = null, int $indicatorChangeInterval = 100, ?array $indicatorValues = null) + { + $this->output = $output; + $format = $format ?? $this->determineBestFormat(); + $indicatorValues = $indicatorValues ?? ['-', '\\', '|', '/']; + $indicatorValues = \array_values($indicatorValues); + if (2 > \count($indicatorValues)) { + throw new InvalidArgumentException('Must have at least 2 indicator value characters.'); + } + $this->format = self::getFormatDefinition($format); + $this->indicatorChangeInterval = $indicatorChangeInterval; + $this->indicatorValues = $indicatorValues; + $this->startTime = \time(); + } + /** + * Sets the current indicator message. + * + * @return void + */ + public function setMessage(?string $message) + { + $this->message = $message; + $this->display(); + } + /** + * Starts the indicator output. + * + * @return void + */ + public function start(string $message) + { + if ($this->started) { + throw new LogicException('Progress indicator already started.'); + } + $this->message = $message; + $this->started = \true; + $this->startTime = \time(); + $this->indicatorUpdateTime = $this->getCurrentTimeInMilliseconds() + $this->indicatorChangeInterval; + $this->indicatorCurrent = 0; + $this->display(); + } + /** + * Advances the indicator. + * + * @return void + */ + public function advance() + { + if (!$this->started) { + throw new LogicException('Progress indicator has not yet been started.'); + } + if (!$this->output->isDecorated()) { + return; + } + $currentTime = $this->getCurrentTimeInMilliseconds(); + if ($currentTime < $this->indicatorUpdateTime) { + return; + } + $this->indicatorUpdateTime = $currentTime + $this->indicatorChangeInterval; + ++$this->indicatorCurrent; + $this->display(); + } + /** + * Finish the indicator with message. + * + * @return void + */ + public function finish(string $message) + { + if (!$this->started) { + throw new LogicException('Progress indicator has not yet been started.'); + } + $this->message = $message; + $this->display(); + $this->output->writeln(''); + $this->started = \false; + } + /** + * Gets the format for a given name. + */ + public static function getFormatDefinition(string $name) : ?string + { + return self::FORMATS[$name] ?? null; + } + /** + * Sets a placeholder formatter for a given name. + * + * This method also allow you to override an existing placeholder. + * + * @return void + */ + public static function setPlaceholderFormatterDefinition(string $name, callable $callable) + { + self::$formatters = self::$formatters ?? self::initPlaceholderFormatters(); + self::$formatters[$name] = $callable; + } + /** + * Gets the placeholder formatter for a given name (including the delimiter char like %). + */ + public static function getPlaceholderFormatterDefinition(string $name) : ?callable + { + self::$formatters = self::$formatters ?? self::initPlaceholderFormatters(); + return self::$formatters[$name] ?? null; + } + private function display() : void + { + if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { + return; + } + $this->overwrite(\preg_replace_callback("{%([a-z\\-_]+)(?:\\:([^%]+))?%}i", function ($matches) { + if ($formatter = self::getPlaceholderFormatterDefinition($matches[1])) { + return $formatter($this); + } + return $matches[0]; + }, $this->format ?? '')); + } + private function determineBestFormat() : string + { + switch ($this->output->getVerbosity()) { + case OutputInterface::VERBOSITY_VERBOSE: + return $this->output->isDecorated() ? 'verbose' : 'verbose_no_ansi'; + case OutputInterface::VERBOSITY_VERY_VERBOSE: + case OutputInterface::VERBOSITY_DEBUG: + return $this->output->isDecorated() ? 'very_verbose' : 'very_verbose_no_ansi'; + default: + return $this->output->isDecorated() ? 'normal' : 'normal_no_ansi'; + } + } + /** + * Overwrites a previous message to the output. + */ + private function overwrite(string $message) : void + { + if ($this->output->isDecorated()) { + $this->output->write("\r\x1b[2K"); + $this->output->write($message); + } else { + $this->output->writeln($message); + } + } + private function getCurrentTimeInMilliseconds() : float + { + return \round(\microtime(\true) * 1000); + } + /** + * @return array + */ + private static function initPlaceholderFormatters() : array + { + return ['indicator' => function (self $indicator) { + return $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)]; + }, 'message' => function (self $indicator) { + return $indicator->message; + }, 'elapsed' => function (self $indicator) { + return Helper::formatTime(\time() - $indicator->startTime, 2); + }, 'memory' => function () { + return Helper::formatMemory(\memory_get_usage(\true)); + }]; + } +} diff --git a/vendor/symfony/console/Helper/QuestionHelper.php b/vendor/symfony/console/Helper/QuestionHelper.php new file mode 100644 index 00000000..d853569a --- /dev/null +++ b/vendor/symfony/console/Helper/QuestionHelper.php @@ -0,0 +1,508 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Cursor; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\MissingInputException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RuntimeException; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatter; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatterStyle; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\StreamableInputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Question\ChoiceQuestion; +use RuleDocGenerator202403\Symfony\Component\Console\Question\Question; +use RuleDocGenerator202403\Symfony\Component\Console\Terminal; +use function RuleDocGenerator202403\Symfony\Component\String\s; +/** + * The QuestionHelper class provides helpers to interact with the user. + * + * @author Fabien Potencier + */ +class QuestionHelper extends Helper +{ + /** + * @var resource|null + */ + private $inputStream; + /** + * @var bool + */ + private static $stty = \true; + /** + * @var bool + */ + private static $stdinIsInteractive; + /** + * Asks a question to the user. + * + * @return mixed The user answer + * + * @throws RuntimeException If there is no data to read in the input stream + */ + public function ask(InputInterface $input, OutputInterface $output, Question $question) + { + if ($output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + if (!$input->isInteractive()) { + return $this->getDefaultAnswer($question); + } + if ($input instanceof StreamableInputInterface && ($stream = $input->getStream())) { + $this->inputStream = $stream; + } + try { + if (!$question->getValidator()) { + return $this->doAsk($output, $question); + } + $interviewer = function () use($output, $question) { + return $this->doAsk($output, $question); + }; + return $this->validateAttempts($interviewer, $output, $question); + } catch (MissingInputException $exception) { + $input->setInteractive(\false); + if (null === ($fallbackOutput = $this->getDefaultAnswer($question))) { + throw $exception; + } + return $fallbackOutput; + } + } + public function getName() : string + { + return 'question'; + } + /** + * Prevents usage of stty. + * + * @return void + */ + public static function disableStty() + { + self::$stty = \false; + } + /** + * Asks the question to the user. + * + * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden + * @return mixed + */ + private function doAsk(OutputInterface $output, Question $question) + { + $this->writePrompt($output, $question); + $inputStream = $this->inputStream ?: \STDIN; + $autocomplete = $question->getAutocompleterCallback(); + if (null === $autocomplete || !self::$stty || !Terminal::hasSttyAvailable()) { + $ret = \false; + if ($question->isHidden()) { + try { + $hiddenResponse = $this->getHiddenResponse($output, $inputStream, $question->isTrimmable()); + $ret = $question->isTrimmable() ? \trim($hiddenResponse) : $hiddenResponse; + } catch (RuntimeException $e) { + if (!$question->isHiddenFallback()) { + throw $e; + } + } + } + if (\false === $ret) { + $isBlocked = \stream_get_meta_data($inputStream)['blocked'] ?? \true; + if (!$isBlocked) { + \stream_set_blocking($inputStream, \true); + } + $ret = $this->readInput($inputStream, $question); + if (!$isBlocked) { + \stream_set_blocking($inputStream, \false); + } + if (\false === $ret) { + throw new MissingInputException('Aborted.'); + } + if ($question->isTrimmable()) { + $ret = \trim($ret); + } + } + } else { + $autocomplete = $this->autocomplete($output, $question, $inputStream, $autocomplete); + $ret = $question->isTrimmable() ? \trim($autocomplete) : $autocomplete; + } + if ($output instanceof ConsoleSectionOutput) { + $output->addContent(''); + // add EOL to the question + $output->addContent($ret); + } + $ret = \strlen($ret) > 0 ? $ret : $question->getDefault(); + if ($normalizer = $question->getNormalizer()) { + return $normalizer($ret); + } + return $ret; + } + /** + * @return mixed + */ + private function getDefaultAnswer(Question $question) + { + $default = $question->getDefault(); + if (null === $default) { + return $default; + } + if ($validator = $question->getValidator()) { + return \call_user_func($validator, $default); + } elseif ($question instanceof ChoiceQuestion) { + $choices = $question->getChoices(); + if (!$question->isMultiselect()) { + return $choices[$default] ?? $default; + } + $default = \explode(',', $default); + foreach ($default as $k => $v) { + $v = $question->isTrimmable() ? \trim($v) : $v; + $default[$k] = $choices[$v] ?? $v; + } + } + return $default; + } + /** + * Outputs the question prompt. + * + * @return void + */ + protected function writePrompt(OutputInterface $output, Question $question) + { + $message = $question->getQuestion(); + if ($question instanceof ChoiceQuestion) { + $output->writeln(\array_merge([$question->getQuestion()], $this->formatChoiceQuestionChoices($question, 'info'))); + $message = $question->getPrompt(); + } + $output->write($message); + } + /** + * @return string[] + */ + protected function formatChoiceQuestionChoices(ChoiceQuestion $question, string $tag) : array + { + $messages = []; + $maxWidth = \max(\array_map([__CLASS__, 'width'], \array_keys($choices = $question->getChoices()))); + foreach ($choices as $key => $value) { + $padding = \str_repeat(' ', $maxWidth - self::width($key)); + $messages[] = \sprintf(" [<{$tag}>%s{$padding}] %s", $key, $value); + } + return $messages; + } + /** + * Outputs an error message. + * + * @return void + */ + protected function writeError(OutputInterface $output, \Exception $error) + { + if (null !== $this->getHelperSet() && $this->getHelperSet()->has('formatter')) { + $message = $this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error'); + } else { + $message = '' . $error->getMessage() . ''; + } + $output->writeln($message); + } + /** + * Autocompletes a question. + * + * @param resource $inputStream + */ + private function autocomplete(OutputInterface $output, Question $question, $inputStream, callable $autocomplete) : string + { + $cursor = new Cursor($output, $inputStream); + $fullChoice = ''; + $ret = ''; + $i = 0; + $ofs = -1; + $matches = $autocomplete($ret); + $numMatches = \count($matches); + $sttyMode = \shell_exec('stty -g'); + $isStdin = 'php://stdin' === (\stream_get_meta_data($inputStream)['uri'] ?? null); + $r = [$inputStream]; + $w = []; + // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead) + \shell_exec('stty -icanon -echo'); + // Add highlighted text style + $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white')); + // Read a keypress + while (!\feof($inputStream)) { + while ($isStdin && 0 === @\stream_select($r, $w, $w, 0, 100)) { + // Give signal handlers a chance to run + $r = [$inputStream]; + } + $c = \fread($inputStream, 1); + // as opposed to fgets(), fread() returns an empty string when the stream content is empty, not false. + if (\false === $c || '' === $ret && '' === $c && null === $question->getDefault()) { + \shell_exec('stty ' . $sttyMode); + throw new MissingInputException('Aborted.'); + } elseif ("" === $c) { + // Backspace Character + if (0 === $numMatches && 0 !== $i) { + --$i; + $cursor->moveLeft(s($fullChoice)->slice(-1)->width(\false)); + $fullChoice = self::substr($fullChoice, 0, $i); + } + if (0 === $i) { + $ofs = -1; + $matches = $autocomplete($ret); + $numMatches = \count($matches); + } else { + $numMatches = 0; + } + // Pop the last character off the end of our string + $ret = self::substr($ret, 0, $i); + } elseif ("\x1b" === $c) { + // Did we read an escape sequence? + $c .= \fread($inputStream, 2); + // A = Up Arrow. B = Down Arrow + if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) { + if ('A' === $c[2] && -1 === $ofs) { + $ofs = 0; + } + if (0 === $numMatches) { + continue; + } + $ofs += 'A' === $c[2] ? -1 : 1; + $ofs = ($numMatches + $ofs) % $numMatches; + } + } elseif (\ord($c) < 32) { + if ("\t" === $c || "\n" === $c) { + if ($numMatches > 0 && -1 !== $ofs) { + $ret = (string) $matches[$ofs]; + // Echo out remaining chars for current match + $remainingCharacters = \substr($ret, \strlen(\trim($this->mostRecentlyEnteredValue($fullChoice)))); + $output->write($remainingCharacters); + $fullChoice .= $remainingCharacters; + $i = \false === ($encoding = \mb_detect_encoding($fullChoice, null, \true)) ? \strlen($fullChoice) : \mb_strlen($fullChoice, $encoding); + $matches = \array_filter($autocomplete($ret), function ($match) use($ret) { + return '' === $ret || \strncmp($match, $ret, \strlen($ret)) === 0; + }); + $numMatches = \count($matches); + $ofs = -1; + } + if ("\n" === $c) { + $output->write($c); + break; + } + $numMatches = 0; + } + continue; + } else { + if ("\x80" <= $c) { + $c .= \fread($inputStream, ["\xc0" => 1, "\xd0" => 1, "\xe0" => 2, "\xf0" => 3][$c & "\xf0"]); + } + $output->write($c); + $ret .= $c; + $fullChoice .= $c; + ++$i; + $tempRet = $ret; + if ($question instanceof ChoiceQuestion && $question->isMultiselect()) { + $tempRet = $this->mostRecentlyEnteredValue($fullChoice); + } + $numMatches = 0; + $ofs = 0; + foreach ($autocomplete($ret) as $value) { + // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle) + if (\strncmp($value, $tempRet, \strlen($tempRet)) === 0) { + $matches[$numMatches++] = $value; + } + } + } + $cursor->clearLineAfter(); + if ($numMatches > 0 && -1 !== $ofs) { + $cursor->savePosition(); + // Write highlighted text, complete the partially entered response + $charactersEntered = \strlen(\trim($this->mostRecentlyEnteredValue($fullChoice))); + $output->write('' . OutputFormatter::escapeTrailingBackslash(\substr($matches[$ofs], $charactersEntered)) . ''); + $cursor->restorePosition(); + } + } + // Reset stty so it behaves normally again + \shell_exec('stty ' . $sttyMode); + return $fullChoice; + } + private function mostRecentlyEnteredValue(string $entered) : string + { + // Determine the most recent value that the user entered + if (\strpos($entered, ',') === \false) { + return $entered; + } + $choices = \explode(',', $entered); + if ('' !== ($lastChoice = \trim($choices[\count($choices) - 1]))) { + return $lastChoice; + } + return $entered; + } + /** + * Gets a hidden response from user. + * + * @param resource $inputStream The handler resource + * @param bool $trimmable Is the answer trimmable + * + * @throws RuntimeException In case the fallback is deactivated and the response cannot be hidden + */ + private function getHiddenResponse(OutputInterface $output, $inputStream, bool $trimmable = \true) : string + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $exe = __DIR__ . '/../Resources/bin/hiddeninput.exe'; + // handle code running from a phar + if (\strncmp(__FILE__, 'phar:', \strlen('phar:')) === 0) { + $tmpExe = \sys_get_temp_dir() . '/hiddeninput.exe'; + \copy($exe, $tmpExe); + $exe = $tmpExe; + } + $sExec = \shell_exec('"' . $exe . '"'); + $value = $trimmable ? \rtrim($sExec) : $sExec; + $output->writeln(''); + if (isset($tmpExe)) { + \unlink($tmpExe); + } + return $value; + } + if (self::$stty && Terminal::hasSttyAvailable()) { + $sttyMode = \shell_exec('stty -g'); + \shell_exec('stty -echo'); + } elseif ($this->isInteractiveInput($inputStream)) { + throw new RuntimeException('Unable to hide the response.'); + } + $value = \fgets($inputStream, 4096); + if (4095 === \strlen($value)) { + $errOutput = $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output; + $errOutput->warning('The value was possibly truncated by your shell or terminal emulator'); + } + if (self::$stty && Terminal::hasSttyAvailable()) { + \shell_exec('stty ' . $sttyMode); + } + if (\false === $value) { + throw new MissingInputException('Aborted.'); + } + if ($trimmable) { + $value = \trim($value); + } + $output->writeln(''); + return $value; + } + /** + * Validates an attempt. + * + * @param callable $interviewer A callable that will ask for a question and return the result + * + * @throws \Exception In case the max number of attempts has been reached and no valid response has been given + * @return mixed + */ + private function validateAttempts(callable $interviewer, OutputInterface $output, Question $question) + { + $error = null; + $attempts = $question->getMaxAttempts(); + while (null === $attempts || $attempts--) { + if (null !== $error) { + $this->writeError($output, $error); + } + try { + return $question->getValidator()($interviewer()); + } catch (RuntimeException $e) { + throw $e; + } catch (\Exception $error) { + } + } + throw $error; + } + private function isInteractiveInput($inputStream) : bool + { + if ('php://stdin' !== (\stream_get_meta_data($inputStream)['uri'] ?? null)) { + return \false; + } + if (isset(self::$stdinIsInteractive)) { + return self::$stdinIsInteractive; + } + return self::$stdinIsInteractive = @\stream_isatty(\fopen('php://stdin', 'r')); + } + /** + * Reads one or more lines of input and returns what is read. + * + * @param resource $inputStream The handler resource + * @param Question $question The question being asked + * @return string|false + */ + private function readInput($inputStream, Question $question) + { + if (!$question->isMultiline()) { + $cp = $this->setIOCodepage(); + $ret = \fgets($inputStream, 4096); + return $this->resetIOCodepage($cp, $ret); + } + $multiLineStreamReader = $this->cloneInputStream($inputStream); + if (null === $multiLineStreamReader) { + return \false; + } + $ret = ''; + $cp = $this->setIOCodepage(); + while (\false !== ($char = \fgetc($multiLineStreamReader))) { + if (\PHP_EOL === "{$ret}{$char}") { + break; + } + $ret .= $char; + } + return $this->resetIOCodepage($cp, $ret); + } + private function setIOCodepage() : int + { + if (\function_exists('sapi_windows_cp_set')) { + $cp = \sapi_windows_cp_get(); + \sapi_windows_cp_set(\sapi_windows_cp_get('oem')); + return $cp; + } + return 0; + } + /** + * Sets console I/O to the specified code page and converts the user input. + * @param string|false $input + * @return string|false + */ + private function resetIOCodepage(int $cp, $input) + { + if (0 !== $cp) { + \sapi_windows_cp_set($cp); + if (\false !== $input && '' !== $input) { + $input = \sapi_windows_cp_conv(\sapi_windows_cp_get('oem'), $cp, $input); + } + } + return $input; + } + /** + * Clones an input stream in order to act on one instance of the same + * stream without affecting the other instance. + * + * @param resource $inputStream The handler resource + * + * @return resource|null The cloned resource, null in case it could not be cloned + */ + private function cloneInputStream($inputStream) + { + $streamMetaData = \stream_get_meta_data($inputStream); + $seekable = $streamMetaData['seekable'] ?? \false; + $mode = $streamMetaData['mode'] ?? 'rb'; + $uri = $streamMetaData['uri'] ?? null; + if (null === $uri) { + return null; + } + $cloneStream = \fopen($uri, $mode); + // For seekable and writable streams, add all the same data to the + // cloned stream and then seek to the same offset. + if (\true === $seekable && !\in_array($mode, ['r', 'rb', 'rt'])) { + $offset = \ftell($inputStream); + \rewind($inputStream); + \stream_copy_to_stream($inputStream, $cloneStream); + \fseek($inputStream, $offset); + \fseek($cloneStream, $offset); + } + return $cloneStream; + } +} diff --git a/vendor/symfony/console/Helper/SymfonyQuestionHelper.php b/vendor/symfony/console/Helper/SymfonyQuestionHelper.php new file mode 100644 index 00000000..e46dcdc2 --- /dev/null +++ b/vendor/symfony/console/Helper/SymfonyQuestionHelper.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatter; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Question\ChoiceQuestion; +use RuleDocGenerator202403\Symfony\Component\Console\Question\ConfirmationQuestion; +use RuleDocGenerator202403\Symfony\Component\Console\Question\Question; +use RuleDocGenerator202403\Symfony\Component\Console\Style\SymfonyStyle; +/** + * Symfony Style Guide compliant question helper. + * + * @author Kevin Bond + */ +class SymfonyQuestionHelper extends QuestionHelper +{ + /** + * @return void + */ + protected function writePrompt(OutputInterface $output, Question $question) + { + $text = OutputFormatter::escapeTrailingBackslash($question->getQuestion()); + $default = $question->getDefault(); + if ($question->isMultiline()) { + $text .= \sprintf(' (press %s to continue)', $this->getEofShortcut()); + } + switch (\true) { + case null === $default: + $text = \sprintf(' %s:', $text); + break; + case $question instanceof ConfirmationQuestion: + $text = \sprintf(' %s (yes/no) [%s]:', $text, $default ? 'yes' : 'no'); + break; + case $question instanceof ChoiceQuestion && $question->isMultiselect(): + $choices = $question->getChoices(); + $default = \explode(',', $default); + foreach ($default as $key => $value) { + $default[$key] = $choices[\trim($value)]; + } + $text = \sprintf(' %s [%s]:', $text, OutputFormatter::escape(\implode(', ', $default))); + break; + case $question instanceof ChoiceQuestion: + $choices = $question->getChoices(); + $text = \sprintf(' %s [%s]:', $text, OutputFormatter::escape($choices[$default] ?? $default)); + break; + default: + $text = \sprintf(' %s [%s]:', $text, OutputFormatter::escape($default)); + } + $output->writeln($text); + $prompt = ' > '; + if ($question instanceof ChoiceQuestion) { + $output->writeln($this->formatChoiceQuestionChoices($question, 'comment')); + $prompt = $question->getPrompt(); + } + $output->write($prompt); + } + /** + * @return void + */ + protected function writeError(OutputInterface $output, \Exception $error) + { + if ($output instanceof SymfonyStyle) { + $output->newLine(); + $output->error($error->getMessage()); + return; + } + parent::writeError($output, $error); + } + private function getEofShortcut() : string + { + if ('Windows' === \PHP_OS_FAMILY) { + return 'Ctrl+Z then Enter'; + } + return 'Ctrl+D'; + } +} diff --git a/vendor/symfony/console/Helper/Table.php b/vendor/symfony/console/Helper/Table.php new file mode 100644 index 00000000..1d1a05f0 --- /dev/null +++ b/vendor/symfony/console/Helper/Table.php @@ -0,0 +1,811 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RuntimeException; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatter; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\WrappableOutputFormatterInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * Provides helpers to display a table. + * + * @author Fabien Potencier + * @author Саша Стаменковић + * @author Abdellatif Ait boudad + * @author Max Grigorian + * @author Dany Maillard + */ +class Table +{ + private const SEPARATOR_TOP = 0; + private const SEPARATOR_TOP_BOTTOM = 1; + private const SEPARATOR_MID = 2; + private const SEPARATOR_BOTTOM = 3; + private const BORDER_OUTSIDE = 0; + private const BORDER_INSIDE = 1; + private const DISPLAY_ORIENTATION_DEFAULT = 'default'; + private const DISPLAY_ORIENTATION_HORIZONTAL = 'horizontal'; + private const DISPLAY_ORIENTATION_VERTICAL = 'vertical'; + /** + * @var string|null + */ + private $headerTitle; + /** + * @var string|null + */ + private $footerTitle; + /** + * @var mixed[] + */ + private $headers = []; + /** + * @var mixed[] + */ + private $rows = []; + /** + * @var mixed[] + */ + private $effectiveColumnWidths = []; + /** + * @var int + */ + private $numberOfColumns; + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $output; + /** + * @var \Symfony\Component\Console\Helper\TableStyle + */ + private $style; + /** + * @var mixed[] + */ + private $columnStyles = []; + /** + * @var mixed[] + */ + private $columnWidths = []; + /** + * @var mixed[] + */ + private $columnMaxWidths = []; + /** + * @var bool + */ + private $rendered = \false; + /** + * @var string + */ + private $displayOrientation = self::DISPLAY_ORIENTATION_DEFAULT; + /** + * @var mixed[] + */ + private static $styles; + public function __construct(OutputInterface $output) + { + $this->output = $output; + self::$styles = self::$styles ?? self::initStyles(); + $this->setStyle('default'); + } + /** + * Sets a style definition. + * + * @return void + */ + public static function setStyleDefinition(string $name, TableStyle $style) + { + self::$styles = self::$styles ?? self::initStyles(); + self::$styles[$name] = $style; + } + /** + * Gets a style definition by name. + */ + public static function getStyleDefinition(string $name) : TableStyle + { + self::$styles = self::$styles ?? self::initStyles(); + if (!isset(self::$styles[$name])) { + throw new InvalidArgumentException(\sprintf('Style "%s" is not defined.', $name)); + } + return self::$styles[$name]; + } + /** + * Sets table style. + * + * @return $this + * @param \Symfony\Component\Console\Helper\TableStyle|string $name + */ + public function setStyle($name) + { + $this->style = $this->resolveStyle($name); + return $this; + } + /** + * Gets the current table style. + */ + public function getStyle() : TableStyle + { + return $this->style; + } + /** + * Sets table column style. + * + * @param TableStyle|string $name The style name or a TableStyle instance + * + * @return $this + */ + public function setColumnStyle(int $columnIndex, $name) + { + $this->columnStyles[$columnIndex] = $this->resolveStyle($name); + return $this; + } + /** + * Gets the current style for a column. + * + * If style was not set, it returns the global table style. + */ + public function getColumnStyle(int $columnIndex) : TableStyle + { + return $this->columnStyles[$columnIndex] ?? $this->getStyle(); + } + /** + * Sets the minimum width of a column. + * + * @return $this + */ + public function setColumnWidth(int $columnIndex, int $width) + { + $this->columnWidths[$columnIndex] = $width; + return $this; + } + /** + * Sets the minimum width of all columns. + * + * @return $this + */ + public function setColumnWidths(array $widths) + { + $this->columnWidths = []; + foreach ($widths as $index => $width) { + $this->setColumnWidth($index, $width); + } + return $this; + } + /** + * Sets the maximum width of a column. + * + * Any cell within this column which contents exceeds the specified width will be wrapped into multiple lines, while + * formatted strings are preserved. + * + * @return $this + */ + public function setColumnMaxWidth(int $columnIndex, int $width) + { + if (!$this->output->getFormatter() instanceof WrappableOutputFormatterInterface) { + throw new \LogicException(\sprintf('Setting a maximum column width is only supported when using a "%s" formatter, got "%s".', WrappableOutputFormatterInterface::class, \get_debug_type($this->output->getFormatter()))); + } + $this->columnMaxWidths[$columnIndex] = $width; + return $this; + } + /** + * @return $this + */ + public function setHeaders(array $headers) + { + $headers = \array_values($headers); + if ($headers && !\is_array($headers[0])) { + $headers = [$headers]; + } + $this->headers = $headers; + return $this; + } + /** + * @return $this + */ + public function setRows(array $rows) + { + $this->rows = []; + return $this->addRows($rows); + } + /** + * @return $this + */ + public function addRows(array $rows) + { + foreach ($rows as $row) { + $this->addRow($row); + } + return $this; + } + /** + * @return $this + * @param \Symfony\Component\Console\Helper\TableSeparator|mixed[] $row + */ + public function addRow($row) + { + if ($row instanceof TableSeparator) { + $this->rows[] = $row; + return $this; + } + $this->rows[] = \array_values($row); + return $this; + } + /** + * Adds a row to the table, and re-renders the table. + * + * @return $this + * @param \Symfony\Component\Console\Helper\TableSeparator|mixed[] $row + */ + public function appendRow($row) + { + if (!$this->output instanceof ConsoleSectionOutput) { + throw new RuntimeException(\sprintf('Output should be an instance of "%s" when calling "%s".', ConsoleSectionOutput::class, __METHOD__)); + } + if ($this->rendered) { + $this->output->clear($this->calculateRowCount()); + } + $this->addRow($row); + $this->render(); + return $this; + } + /** + * @return $this + * @param int|string $column + */ + public function setRow($column, array $row) + { + $this->rows[$column] = $row; + return $this; + } + /** + * @return $this + */ + public function setHeaderTitle(?string $title) + { + $this->headerTitle = $title; + return $this; + } + /** + * @return $this + */ + public function setFooterTitle(?string $title) + { + $this->footerTitle = $title; + return $this; + } + /** + * @return $this + */ + public function setHorizontal(bool $horizontal = \true) + { + $this->displayOrientation = $horizontal ? self::DISPLAY_ORIENTATION_HORIZONTAL : self::DISPLAY_ORIENTATION_DEFAULT; + return $this; + } + /** + * @return $this + */ + public function setVertical(bool $vertical = \true) + { + $this->displayOrientation = $vertical ? self::DISPLAY_ORIENTATION_VERTICAL : self::DISPLAY_ORIENTATION_DEFAULT; + return $this; + } + /** + * Renders table to output. + * + * Example: + * + * +---------------+-----------------------+------------------+ + * | ISBN | Title | Author | + * +---------------+-----------------------+------------------+ + * | 99921-58-10-7 | Divine Comedy | Dante Alighieri | + * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | + * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | + * +---------------+-----------------------+------------------+ + * + * @return void + */ + public function render() + { + $divider = new TableSeparator(); + $isCellWithColspan = static function ($cell) { + return $cell instanceof TableCell && $cell->getColspan() >= 2; + }; + $horizontal = self::DISPLAY_ORIENTATION_HORIZONTAL === $this->displayOrientation; + $vertical = self::DISPLAY_ORIENTATION_VERTICAL === $this->displayOrientation; + $rows = []; + if ($horizontal) { + foreach ($this->headers[0] ?? [] as $i => $header) { + $rows[$i] = [$header]; + foreach ($this->rows as $row) { + if ($row instanceof TableSeparator) { + continue; + } + if (isset($row[$i])) { + $rows[$i][] = $row[$i]; + } elseif ($isCellWithColspan($rows[$i][0])) { + // Noop, there is a "title" + } else { + $rows[$i][] = null; + } + } + } + } elseif ($vertical) { + $formatter = $this->output->getFormatter(); + $maxHeaderLength = \array_reduce($this->headers[0] ?? [], static function ($max, $header) use($formatter) { + return \max($max, Helper::width(Helper::removeDecoration($formatter, $header))); + }, 0); + foreach ($this->rows as $row) { + if ($row instanceof TableSeparator) { + continue; + } + if ($rows) { + $rows[] = [$divider]; + } + $containsColspan = \false; + foreach ($row as $cell) { + if ($containsColspan = $isCellWithColspan($cell)) { + break; + } + } + $headers = $this->headers[0] ?? []; + $maxRows = \max(\count($headers), \count($row)); + for ($i = 0; $i < $maxRows; ++$i) { + $cell = (string) ($row[$i] ?? ''); + $eol = \strpos($cell, "\r\n") !== \false ? "\r\n" : "\n"; + $parts = \explode($eol, $cell); + foreach ($parts as $idx => $part) { + if ($headers && !$containsColspan) { + if (0 === $idx) { + $rows[] = [\sprintf('%s: %s', \str_pad($headers[$i] ?? '', $maxHeaderLength, ' ', \STR_PAD_LEFT), $part)]; + } else { + $rows[] = [\sprintf('%s %s', \str_pad('', $maxHeaderLength, ' ', \STR_PAD_LEFT), $part)]; + } + } elseif ('' !== $cell) { + $rows[] = [$part]; + } + } + } + } + } else { + $rows = \array_merge($this->headers, [$divider], $this->rows); + } + $this->calculateNumberOfColumns($rows); + $rowGroups = $this->buildTableRows($rows); + $this->calculateColumnsWidth($rowGroups); + $isHeader = !$horizontal; + $isFirstRow = $horizontal; + $hasTitle = (bool) $this->headerTitle; + foreach ($rowGroups as $rowGroup) { + $isHeaderSeparatorRendered = \false; + foreach ($rowGroup as $row) { + if ($divider === $row) { + $isHeader = \false; + $isFirstRow = \true; + continue; + } + if ($row instanceof TableSeparator) { + $this->renderRowSeparator(); + continue; + } + if (!$row) { + continue; + } + if ($isHeader && !$isHeaderSeparatorRendered) { + $this->renderRowSeparator(self::SEPARATOR_TOP, $hasTitle ? $this->headerTitle : null, $hasTitle ? $this->style->getHeaderTitleFormat() : null); + $hasTitle = \false; + $isHeaderSeparatorRendered = \true; + } + if ($isFirstRow) { + $this->renderRowSeparator($horizontal ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM, $hasTitle ? $this->headerTitle : null, $hasTitle ? $this->style->getHeaderTitleFormat() : null); + $isFirstRow = \false; + $hasTitle = \false; + } + if ($vertical) { + $isHeader = \false; + $isFirstRow = \false; + } + if ($horizontal) { + $this->renderRow($row, $this->style->getCellRowFormat(), $this->style->getCellHeaderFormat()); + } else { + $this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat()); + } + } + } + $this->renderRowSeparator(self::SEPARATOR_BOTTOM, $this->footerTitle, $this->style->getFooterTitleFormat()); + $this->cleanup(); + $this->rendered = \true; + } + /** + * Renders horizontal header separator. + * + * Example: + * + * +-----+-----------+-------+ + */ + private function renderRowSeparator(int $type = self::SEPARATOR_MID, ?string $title = null, ?string $titleFormat = null) : void + { + if (!($count = $this->numberOfColumns)) { + return; + } + $borders = $this->style->getBorderChars(); + if (!$borders[0] && !$borders[2] && !$this->style->getCrossingChar()) { + return; + } + $crossings = $this->style->getCrossingChars(); + if (self::SEPARATOR_MID === $type) { + [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[2], $crossings[8], $crossings[0], $crossings[4]]; + } elseif (self::SEPARATOR_TOP === $type) { + [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[1], $crossings[2], $crossings[3]]; + } elseif (self::SEPARATOR_TOP_BOTTOM === $type) { + [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[9], $crossings[10], $crossings[11]]; + } else { + [$horizontal, $leftChar, $midChar, $rightChar] = [$borders[0], $crossings[7], $crossings[6], $crossings[5]]; + } + $markup = $leftChar; + for ($column = 0; $column < $count; ++$column) { + $markup .= \str_repeat($horizontal, $this->effectiveColumnWidths[$column]); + $markup .= $column === $count - 1 ? $rightChar : $midChar; + } + if (null !== $title) { + $titleLength = Helper::width(Helper::removeDecoration($formatter = $this->output->getFormatter(), $formattedTitle = \sprintf($titleFormat, $title))); + $markupLength = Helper::width($markup); + if ($titleLength > ($limit = $markupLength - 4)) { + $titleLength = $limit; + $formatLength = Helper::width(Helper::removeDecoration($formatter, \sprintf($titleFormat, ''))); + $formattedTitle = \sprintf($titleFormat, Helper::substr($title, 0, $limit - $formatLength - 3) . '...'); + } + $titleStart = \intdiv($markupLength - $titleLength, 2); + if (\false === \mb_detect_encoding($markup, null, \true)) { + $markup = \substr_replace($markup, $formattedTitle, $titleStart, $titleLength); + } else { + $markup = \mb_substr($markup, 0, $titleStart) . $formattedTitle . \mb_substr($markup, $titleStart + $titleLength); + } + } + $this->output->writeln(\sprintf($this->style->getBorderFormat(), $markup)); + } + /** + * Renders vertical column separator. + */ + private function renderColumnSeparator(int $type = self::BORDER_OUTSIDE) : string + { + $borders = $this->style->getBorderChars(); + return \sprintf($this->style->getBorderFormat(), self::BORDER_OUTSIDE === $type ? $borders[1] : $borders[3]); + } + /** + * Renders table row. + * + * Example: + * + * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | + */ + private function renderRow(array $row, string $cellFormat, ?string $firstCellFormat = null) : void + { + $rowContent = $this->renderColumnSeparator(self::BORDER_OUTSIDE); + $columns = $this->getRowColumns($row); + $last = \count($columns) - 1; + foreach ($columns as $i => $column) { + if ($firstCellFormat && 0 === $i) { + $rowContent .= $this->renderCell($row, $column, $firstCellFormat); + } else { + $rowContent .= $this->renderCell($row, $column, $cellFormat); + } + $rowContent .= $this->renderColumnSeparator($last === $i ? self::BORDER_OUTSIDE : self::BORDER_INSIDE); + } + $this->output->writeln($rowContent); + } + /** + * Renders table cell with padding. + */ + private function renderCell(array $row, int $column, string $cellFormat) : string + { + $cell = $row[$column] ?? ''; + $width = $this->effectiveColumnWidths[$column]; + if ($cell instanceof TableCell && $cell->getColspan() > 1) { + // add the width of the following columns(numbers of colspan). + foreach (\range($column + 1, $column + $cell->getColspan() - 1) as $nextColumn) { + $width += $this->getColumnSeparatorWidth() + $this->effectiveColumnWidths[$nextColumn]; + } + } + // str_pad won't work properly with multi-byte strings, we need to fix the padding + if (\false !== ($encoding = \mb_detect_encoding($cell, null, \true))) { + $width += \strlen($cell) - \mb_strwidth($cell, $encoding); + } + $style = $this->getColumnStyle($column); + if ($cell instanceof TableSeparator) { + return \sprintf($style->getBorderFormat(), \str_repeat($style->getBorderChars()[2], $width)); + } + $width += Helper::length($cell) - Helper::length(Helper::removeDecoration($this->output->getFormatter(), $cell)); + $content = \sprintf($style->getCellRowContentFormat(), $cell); + $padType = $style->getPadType(); + if ($cell instanceof TableCell && $cell->getStyle() instanceof TableCellStyle) { + $isNotStyledByTag = !\preg_match('/^<(\\w+|(\\w+=[\\w,]+;?)*)>.+<\\/(\\w+|(\\w+=\\w+;?)*)?>$/', $cell); + if ($isNotStyledByTag) { + $cellFormat = $cell->getStyle()->getCellFormat(); + if (!\is_string($cellFormat)) { + $tag = \http_build_query($cell->getStyle()->getTagOptions(), '', ';'); + $cellFormat = '<' . $tag . '>%s'; + } + if (\strpos($content, '') !== \false) { + $content = \str_replace('', '', $content); + $width -= 3; + } + if (\strpos($content, '') !== \false) { + $content = \str_replace('', '', $content); + $width -= \strlen(''); + } + } + $padType = $cell->getStyle()->getPadByAlign(); + } + return \sprintf($cellFormat, \str_pad($content, $width, $style->getPaddingChar(), $padType)); + } + /** + * Calculate number of columns for this table. + */ + private function calculateNumberOfColumns(array $rows) : void + { + $columns = [0]; + foreach ($rows as $row) { + if ($row instanceof TableSeparator) { + continue; + } + $columns[] = $this->getNumberOfColumns($row); + } + $this->numberOfColumns = \max($columns); + } + private function buildTableRows(array $rows) : TableRows + { + /** @var WrappableOutputFormatterInterface $formatter */ + $formatter = $this->output->getFormatter(); + $unmergedRows = []; + for ($rowKey = 0; $rowKey < \count($rows); ++$rowKey) { + $rows = $this->fillNextRows($rows, $rowKey); + // Remove any new line breaks and replace it with a new line + foreach ($rows[$rowKey] as $column => $cell) { + $colspan = $cell instanceof TableCell ? $cell->getColspan() : 1; + if (isset($this->columnMaxWidths[$column]) && Helper::width(Helper::removeDecoration($formatter, $cell)) > $this->columnMaxWidths[$column]) { + $cell = $formatter->formatAndWrap($cell, $this->columnMaxWidths[$column] * $colspan); + } + if (\strpos($cell ?? '', "\n") === \false) { + continue; + } + $eol = \strpos($cell ?? '', "\r\n") !== \false ? "\r\n" : "\n"; + $escaped = \implode($eol, \array_map(\Closure::fromCallable([OutputFormatter::class, 'escapeTrailingBackslash']), \explode($eol, $cell))); + $cell = $cell instanceof TableCell ? new TableCell($escaped, ['colspan' => $cell->getColspan()]) : $escaped; + $lines = \explode($eol, \str_replace($eol, '' . $eol, $cell)); + foreach ($lines as $lineKey => $line) { + if ($colspan > 1) { + $line = new TableCell($line, ['colspan' => $colspan]); + } + if (0 === $lineKey) { + $rows[$rowKey][$column] = $line; + } else { + if (!\array_key_exists($rowKey, $unmergedRows) || !\array_key_exists($lineKey, $unmergedRows[$rowKey])) { + $unmergedRows[$rowKey][$lineKey] = $this->copyRow($rows, $rowKey); + } + $unmergedRows[$rowKey][$lineKey][$column] = $line; + } + } + } + } + return new TableRows(function () use($rows, $unmergedRows) : \Traversable { + foreach ($rows as $rowKey => $row) { + $rowGroup = [$row instanceof TableSeparator ? $row : $this->fillCells($row)]; + if (isset($unmergedRows[$rowKey])) { + foreach ($unmergedRows[$rowKey] as $row) { + $rowGroup[] = $row instanceof TableSeparator ? $row : $this->fillCells($row); + } + } + (yield $rowGroup); + } + }); + } + private function calculateRowCount() : int + { + $numberOfRows = \count(\iterator_to_array($this->buildTableRows(\array_merge($this->headers, [new TableSeparator()], $this->rows)))); + if ($this->headers) { + ++$numberOfRows; + // Add row for header separator + } + if ($this->rows) { + ++$numberOfRows; + // Add row for footer separator + } + return $numberOfRows; + } + /** + * fill rows that contains rowspan > 1. + * + * @throws InvalidArgumentException + */ + private function fillNextRows(array $rows, int $line) : array + { + $unmergedRows = []; + foreach ($rows[$line] as $column => $cell) { + if (null !== $cell && !$cell instanceof TableCell && !\is_scalar($cell) && !$cell instanceof \Stringable) { + throw new InvalidArgumentException(\sprintf('A cell must be a TableCell, a scalar or an object implementing "__toString()", "%s" given.', \get_debug_type($cell))); + } + if ($cell instanceof TableCell && $cell->getRowspan() > 1) { + $nbLines = $cell->getRowspan() - 1; + $lines = [$cell]; + if (\strpos($cell, "\n") !== \false) { + $eol = \strpos($cell, "\r\n") !== \false ? "\r\n" : "\n"; + $lines = \explode($eol, \str_replace($eol, '' . $eol . '', $cell)); + $nbLines = \count($lines) > $nbLines ? \substr_count($cell, $eol) : $nbLines; + $rows[$line][$column] = new TableCell($lines[0], ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]); + unset($lines[0]); + } + // create a two dimensional array (rowspan x colspan) + $unmergedRows = \array_replace_recursive(\array_fill($line + 1, $nbLines, []), $unmergedRows); + foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) { + $value = $lines[$unmergedRowKey - $line] ?? ''; + $unmergedRows[$unmergedRowKey][$column] = new TableCell($value, ['colspan' => $cell->getColspan(), 'style' => $cell->getStyle()]); + if ($nbLines === $unmergedRowKey - $line) { + break; + } + } + } + } + foreach ($unmergedRows as $unmergedRowKey => $unmergedRow) { + // we need to know if $unmergedRow will be merged or inserted into $rows + if (isset($rows[$unmergedRowKey]) && \is_array($rows[$unmergedRowKey]) && $this->getNumberOfColumns($rows[$unmergedRowKey]) + $this->getNumberOfColumns($unmergedRows[$unmergedRowKey]) <= $this->numberOfColumns) { + foreach ($unmergedRow as $cellKey => $cell) { + // insert cell into row at cellKey position + \array_splice($rows[$unmergedRowKey], $cellKey, 0, [$cell]); + } + } else { + $row = $this->copyRow($rows, $unmergedRowKey - 1); + foreach ($unmergedRow as $column => $cell) { + if (!empty($cell)) { + $row[$column] = $unmergedRow[$column]; + } + } + \array_splice($rows, $unmergedRowKey, 0, [$row]); + } + } + return $rows; + } + /** + * fill cells for a row that contains colspan > 1. + */ + private function fillCells(iterable $row) : iterable + { + $newRow = []; + foreach ($row as $column => $cell) { + $newRow[] = $cell; + if ($cell instanceof TableCell && $cell->getColspan() > 1) { + foreach (\range($column + 1, $column + $cell->getColspan() - 1) as $position) { + // insert empty value at column position + $newRow[] = ''; + } + } + } + return $newRow ?: $row; + } + private function copyRow(array $rows, int $line) : array + { + $row = $rows[$line]; + foreach ($row as $cellKey => $cellValue) { + $row[$cellKey] = ''; + if ($cellValue instanceof TableCell) { + $row[$cellKey] = new TableCell('', ['colspan' => $cellValue->getColspan()]); + } + } + return $row; + } + /** + * Gets number of columns by row. + */ + private function getNumberOfColumns(array $row) : int + { + $columns = \count($row); + foreach ($row as $column) { + $columns += $column instanceof TableCell ? $column->getColspan() - 1 : 0; + } + return $columns; + } + /** + * Gets list of columns for the given row. + */ + private function getRowColumns(array $row) : array + { + $columns = \range(0, $this->numberOfColumns - 1); + foreach ($row as $cellKey => $cell) { + if ($cell instanceof TableCell && $cell->getColspan() > 1) { + // exclude grouped columns. + $columns = \array_diff($columns, \range($cellKey + 1, $cellKey + $cell->getColspan() - 1)); + } + } + return $columns; + } + /** + * Calculates columns widths. + */ + private function calculateColumnsWidth(iterable $groups) : void + { + for ($column = 0; $column < $this->numberOfColumns; ++$column) { + $lengths = []; + foreach ($groups as $group) { + foreach ($group as $row) { + if ($row instanceof TableSeparator) { + continue; + } + foreach ($row as $i => $cell) { + if ($cell instanceof TableCell) { + $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); + $textLength = Helper::width($textContent); + if ($textLength > 0) { + $contentColumns = \mb_str_split($textContent, \ceil($textLength / $cell->getColspan())); + foreach ($contentColumns as $position => $content) { + $row[$i + $position] = $content; + } + } + } + } + $lengths[] = $this->getCellWidth($row, $column); + } + } + $this->effectiveColumnWidths[$column] = \max($lengths) + Helper::width($this->style->getCellRowContentFormat()) - 2; + } + } + private function getColumnSeparatorWidth() : int + { + return Helper::width(\sprintf($this->style->getBorderFormat(), $this->style->getBorderChars()[3])); + } + private function getCellWidth(array $row, int $column) : int + { + $cellWidth = 0; + if (isset($row[$column])) { + $cell = $row[$column]; + $cellWidth = Helper::width(Helper::removeDecoration($this->output->getFormatter(), $cell)); + } + $columnWidth = $this->columnWidths[$column] ?? 0; + $cellWidth = \max($cellWidth, $columnWidth); + return isset($this->columnMaxWidths[$column]) ? \min($this->columnMaxWidths[$column], $cellWidth) : $cellWidth; + } + /** + * Called after rendering to cleanup cache data. + */ + private function cleanup() : void + { + $this->effectiveColumnWidths = []; + unset($this->numberOfColumns); + } + /** + * @return array + */ + private static function initStyles() : array + { + $borderless = new TableStyle(); + $borderless->setHorizontalBorderChars('=')->setVerticalBorderChars(' ')->setDefaultCrossingChar(' '); + $compact = new TableStyle(); + $compact->setHorizontalBorderChars('')->setVerticalBorderChars('')->setDefaultCrossingChar('')->setCellRowContentFormat('%s '); + $styleGuide = new TableStyle(); + $styleGuide->setHorizontalBorderChars('-')->setVerticalBorderChars(' ')->setDefaultCrossingChar(' ')->setCellHeaderFormat('%s'); + $box = (new TableStyle())->setHorizontalBorderChars('─')->setVerticalBorderChars('│')->setCrossingChars('┼', '┌', '┬', '┐', '┤', '┘', '┴', '└', '├'); + $boxDouble = (new TableStyle())->setHorizontalBorderChars('═', '─')->setVerticalBorderChars('║', '│')->setCrossingChars('┼', '╔', '╤', '╗', '╢', '╝', '╧', '╚', '╟', '╠', '╪', '╣'); + return ['default' => new TableStyle(), 'borderless' => $borderless, 'compact' => $compact, 'symfony-style-guide' => $styleGuide, 'box' => $box, 'box-double' => $boxDouble]; + } + /** + * @param \Symfony\Component\Console\Helper\TableStyle|string $name + */ + private function resolveStyle($name) : TableStyle + { + if ($name instanceof TableStyle) { + return $name; + } + if (!isset(self::$styles[$name])) { + throw new InvalidArgumentException(\sprintf('Style "%s" is not defined.', $name)); + } + return self::$styles[$name]; + } +} diff --git a/vendor/symfony/console/Helper/TableCell.php b/vendor/symfony/console/Helper/TableCell.php new file mode 100644 index 00000000..8e307b5c --- /dev/null +++ b/vendor/symfony/console/Helper/TableCell.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +/** + * @author Abdellatif Ait boudad + */ +class TableCell +{ + /** + * @var string + */ + private $value; + /** + * @var mixed[] + */ + private $options = ['rowspan' => 1, 'colspan' => 1, 'style' => null]; + public function __construct(string $value = '', array $options = []) + { + $this->value = $value; + // check option names + if ($diff = \array_diff(\array_keys($options), \array_keys($this->options))) { + throw new InvalidArgumentException(\sprintf('The TableCell does not support the following options: \'%s\'.', \implode('\', \'', $diff))); + } + if (isset($options['style']) && !$options['style'] instanceof TableCellStyle) { + throw new InvalidArgumentException('The style option must be an instance of "TableCellStyle".'); + } + $this->options = \array_merge($this->options, $options); + } + /** + * Returns the cell value. + */ + public function __toString() : string + { + return $this->value; + } + /** + * Gets number of colspan. + */ + public function getColspan() : int + { + return (int) $this->options['colspan']; + } + /** + * Gets number of rowspan. + */ + public function getRowspan() : int + { + return (int) $this->options['rowspan']; + } + public function getStyle() : ?TableCellStyle + { + return $this->options['style']; + } +} diff --git a/vendor/symfony/console/Helper/TableCellStyle.php b/vendor/symfony/console/Helper/TableCellStyle.php new file mode 100644 index 00000000..021850c6 --- /dev/null +++ b/vendor/symfony/console/Helper/TableCellStyle.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +/** + * @author Yewhen Khoptynskyi + */ +class TableCellStyle +{ + public const DEFAULT_ALIGN = 'left'; + private const TAG_OPTIONS = ['fg', 'bg', 'options']; + private const ALIGN_MAP = ['left' => \STR_PAD_RIGHT, 'center' => \STR_PAD_BOTH, 'right' => \STR_PAD_LEFT]; + /** + * @var mixed[] + */ + private $options = ['fg' => 'default', 'bg' => 'default', 'options' => null, 'align' => self::DEFAULT_ALIGN, 'cellFormat' => null]; + public function __construct(array $options = []) + { + if ($diff = \array_diff(\array_keys($options), \array_keys($this->options))) { + throw new InvalidArgumentException(\sprintf('The TableCellStyle does not support the following options: \'%s\'.', \implode('\', \'', $diff))); + } + if (isset($options['align']) && !\array_key_exists($options['align'], self::ALIGN_MAP)) { + throw new InvalidArgumentException(\sprintf('Wrong align value. Value must be following: \'%s\'.', \implode('\', \'', \array_keys(self::ALIGN_MAP)))); + } + $this->options = \array_merge($this->options, $options); + } + public function getOptions() : array + { + return $this->options; + } + /** + * Gets options we need for tag for example fg, bg. + * + * @return string[] + */ + public function getTagOptions() : array + { + return \array_filter($this->getOptions(), function ($key) { + return \in_array($key, self::TAG_OPTIONS) && isset($this->options[$key]); + }, \ARRAY_FILTER_USE_KEY); + } + public function getPadByAlign() : int + { + return self::ALIGN_MAP[$this->getOptions()['align']]; + } + public function getCellFormat() : ?string + { + return $this->getOptions()['cellFormat']; + } +} diff --git a/vendor/symfony/console/Helper/TableRows.php b/vendor/symfony/console/Helper/TableRows.php new file mode 100644 index 00000000..cc77c847 --- /dev/null +++ b/vendor/symfony/console/Helper/TableRows.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +/** + * @internal + */ +class TableRows implements \IteratorAggregate +{ + /** + * @var \Closure + */ + private $generator; + public function __construct(\Closure $generator) + { + $this->generator = $generator; + } + public function getIterator() : \Traversable + { + return ($this->generator)(); + } +} diff --git a/vendor/symfony/console/Helper/TableSeparator.php b/vendor/symfony/console/Helper/TableSeparator.php new file mode 100644 index 00000000..069469bb --- /dev/null +++ b/vendor/symfony/console/Helper/TableSeparator.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +/** + * Marks a row as being a separator. + * + * @author Fabien Potencier + */ +class TableSeparator extends TableCell +{ + public function __construct(array $options = []) + { + parent::__construct('', $options); + } +} diff --git a/vendor/symfony/console/Helper/TableStyle.php b/vendor/symfony/console/Helper/TableStyle.php new file mode 100644 index 00000000..df020d87 --- /dev/null +++ b/vendor/symfony/console/Helper/TableStyle.php @@ -0,0 +1,378 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Helper; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\LogicException; +/** + * Defines the styles for a Table. + * + * @author Fabien Potencier + * @author Саша Стаменковић + * @author Dany Maillard + */ +class TableStyle +{ + /** + * @var string + */ + private $paddingChar = ' '; + /** + * @var string + */ + private $horizontalOutsideBorderChar = '-'; + /** + * @var string + */ + private $horizontalInsideBorderChar = '-'; + /** + * @var string + */ + private $verticalOutsideBorderChar = '|'; + /** + * @var string + */ + private $verticalInsideBorderChar = '|'; + /** + * @var string + */ + private $crossingChar = '+'; + /** + * @var string + */ + private $crossingTopRightChar = '+'; + /** + * @var string + */ + private $crossingTopMidChar = '+'; + /** + * @var string + */ + private $crossingTopLeftChar = '+'; + /** + * @var string + */ + private $crossingMidRightChar = '+'; + /** + * @var string + */ + private $crossingBottomRightChar = '+'; + /** + * @var string + */ + private $crossingBottomMidChar = '+'; + /** + * @var string + */ + private $crossingBottomLeftChar = '+'; + /** + * @var string + */ + private $crossingMidLeftChar = '+'; + /** + * @var string + */ + private $crossingTopLeftBottomChar = '+'; + /** + * @var string + */ + private $crossingTopMidBottomChar = '+'; + /** + * @var string + */ + private $crossingTopRightBottomChar = '+'; + /** + * @var string + */ + private $headerTitleFormat = ' %s '; + /** + * @var string + */ + private $footerTitleFormat = ' %s '; + /** + * @var string + */ + private $cellHeaderFormat = '%s'; + /** + * @var string + */ + private $cellRowFormat = '%s'; + /** + * @var string + */ + private $cellRowContentFormat = ' %s '; + /** + * @var string + */ + private $borderFormat = '%s'; + /** + * @var int + */ + private $padType = \STR_PAD_RIGHT; + /** + * Sets padding character, used for cell padding. + * + * @return $this + */ + public function setPaddingChar(string $paddingChar) + { + if (!$paddingChar) { + throw new LogicException('The padding char must not be empty.'); + } + $this->paddingChar = $paddingChar; + return $this; + } + /** + * Gets padding character, used for cell padding. + */ + public function getPaddingChar() : string + { + return $this->paddingChar; + } + /** + * Sets horizontal border characters. + * + * + * ╔═══════════════╤══════════════════════════╤══════════════════╗ + * 1 ISBN 2 Title │ Author ║ + * ╠═══════════════╪══════════════════════════╪══════════════════╣ + * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ + * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ + * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ + * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ + * ╚═══════════════╧══════════════════════════╧══════════════════╝ + * + * + * @return $this + */ + public function setHorizontalBorderChars(string $outside, ?string $inside = null) + { + $this->horizontalOutsideBorderChar = $outside; + $this->horizontalInsideBorderChar = $inside ?? $outside; + return $this; + } + /** + * Sets vertical border characters. + * + * + * ╔═══════════════╤══════════════════════════╤══════════════════╗ + * ║ ISBN │ Title │ Author ║ + * ╠═══════1═══════╪══════════════════════════╪══════════════════╣ + * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ + * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ + * ╟───────2───────┼──────────────────────────┼──────────────────╢ + * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ + * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ + * ╚═══════════════╧══════════════════════════╧══════════════════╝ + * + * + * @return $this + */ + public function setVerticalBorderChars(string $outside, ?string $inside = null) + { + $this->verticalOutsideBorderChar = $outside; + $this->verticalInsideBorderChar = $inside ?? $outside; + return $this; + } + /** + * Gets border characters. + * + * @internal + */ + public function getBorderChars() : array + { + return [$this->horizontalOutsideBorderChar, $this->verticalOutsideBorderChar, $this->horizontalInsideBorderChar, $this->verticalInsideBorderChar]; + } + /** + * Sets crossing characters. + * + * Example: + * + * 1═══════════════2══════════════════════════2══════════════════3 + * ║ ISBN │ Title │ Author ║ + * 8'══════════════0'═════════════════════════0'═════════════════4' + * ║ 99921-58-10-7 │ Divine Comedy │ Dante Alighieri ║ + * ║ 9971-5-0210-0 │ A Tale of Two Cities │ Charles Dickens ║ + * 8───────────────0──────────────────────────0──────────────────4 + * ║ 960-425-059-0 │ The Lord of the Rings │ J. R. R. Tolkien ║ + * ║ 80-902734-1-6 │ And Then There Were None │ Agatha Christie ║ + * 7═══════════════6══════════════════════════6══════════════════5 + * + * + * @param string $cross Crossing char (see #0 of example) + * @param string $topLeft Top left char (see #1 of example) + * @param string $topMid Top mid char (see #2 of example) + * @param string $topRight Top right char (see #3 of example) + * @param string $midRight Mid right char (see #4 of example) + * @param string $bottomRight Bottom right char (see #5 of example) + * @param string $bottomMid Bottom mid char (see #6 of example) + * @param string $bottomLeft Bottom left char (see #7 of example) + * @param string $midLeft Mid left char (see #8 of example) + * @param string|null $topLeftBottom Top left bottom char (see #8' of example), equals to $midLeft if null + * @param string|null $topMidBottom Top mid bottom char (see #0' of example), equals to $cross if null + * @param string|null $topRightBottom Top right bottom char (see #4' of example), equals to $midRight if null + * + * @return $this + */ + public function setCrossingChars(string $cross, string $topLeft, string $topMid, string $topRight, string $midRight, string $bottomRight, string $bottomMid, string $bottomLeft, string $midLeft, ?string $topLeftBottom = null, ?string $topMidBottom = null, ?string $topRightBottom = null) + { + $this->crossingChar = $cross; + $this->crossingTopLeftChar = $topLeft; + $this->crossingTopMidChar = $topMid; + $this->crossingTopRightChar = $topRight; + $this->crossingMidRightChar = $midRight; + $this->crossingBottomRightChar = $bottomRight; + $this->crossingBottomMidChar = $bottomMid; + $this->crossingBottomLeftChar = $bottomLeft; + $this->crossingMidLeftChar = $midLeft; + $this->crossingTopLeftBottomChar = $topLeftBottom ?? $midLeft; + $this->crossingTopMidBottomChar = $topMidBottom ?? $cross; + $this->crossingTopRightBottomChar = $topRightBottom ?? $midRight; + return $this; + } + /** + * Sets default crossing character used for each cross. + * + * @see {@link setCrossingChars()} for setting each crossing individually. + */ + public function setDefaultCrossingChar(string $char) : self + { + return $this->setCrossingChars($char, $char, $char, $char, $char, $char, $char, $char, $char); + } + /** + * Gets crossing character. + */ + public function getCrossingChar() : string + { + return $this->crossingChar; + } + /** + * Gets crossing characters. + * + * @internal + */ + public function getCrossingChars() : array + { + return [$this->crossingChar, $this->crossingTopLeftChar, $this->crossingTopMidChar, $this->crossingTopRightChar, $this->crossingMidRightChar, $this->crossingBottomRightChar, $this->crossingBottomMidChar, $this->crossingBottomLeftChar, $this->crossingMidLeftChar, $this->crossingTopLeftBottomChar, $this->crossingTopMidBottomChar, $this->crossingTopRightBottomChar]; + } + /** + * Sets header cell format. + * + * @return $this + */ + public function setCellHeaderFormat(string $cellHeaderFormat) + { + $this->cellHeaderFormat = $cellHeaderFormat; + return $this; + } + /** + * Gets header cell format. + */ + public function getCellHeaderFormat() : string + { + return $this->cellHeaderFormat; + } + /** + * Sets row cell format. + * + * @return $this + */ + public function setCellRowFormat(string $cellRowFormat) + { + $this->cellRowFormat = $cellRowFormat; + return $this; + } + /** + * Gets row cell format. + */ + public function getCellRowFormat() : string + { + return $this->cellRowFormat; + } + /** + * Sets row cell content format. + * + * @return $this + */ + public function setCellRowContentFormat(string $cellRowContentFormat) + { + $this->cellRowContentFormat = $cellRowContentFormat; + return $this; + } + /** + * Gets row cell content format. + */ + public function getCellRowContentFormat() : string + { + return $this->cellRowContentFormat; + } + /** + * Sets table border format. + * + * @return $this + */ + public function setBorderFormat(string $borderFormat) + { + $this->borderFormat = $borderFormat; + return $this; + } + /** + * Gets table border format. + */ + public function getBorderFormat() : string + { + return $this->borderFormat; + } + /** + * Sets cell padding type. + * + * @return $this + */ + public function setPadType(int $padType) + { + if (!\in_array($padType, [\STR_PAD_LEFT, \STR_PAD_RIGHT, \STR_PAD_BOTH], \true)) { + throw new InvalidArgumentException('Invalid padding type. Expected one of (STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH).'); + } + $this->padType = $padType; + return $this; + } + /** + * Gets cell padding type. + */ + public function getPadType() : int + { + return $this->padType; + } + public function getHeaderTitleFormat() : string + { + return $this->headerTitleFormat; + } + /** + * @return $this + */ + public function setHeaderTitleFormat(string $format) + { + $this->headerTitleFormat = $format; + return $this; + } + public function getFooterTitleFormat() : string + { + return $this->footerTitleFormat; + } + /** + * @return $this + */ + public function setFooterTitleFormat(string $format) + { + $this->footerTitleFormat = $format; + return $this; + } +} diff --git a/vendor/symfony/console/Input/ArgvInput.php b/vendor/symfony/console/Input/ArgvInput.php new file mode 100644 index 00000000..0c41439b --- /dev/null +++ b/vendor/symfony/console/Input/ArgvInput.php @@ -0,0 +1,336 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Input; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RuntimeException; +/** + * ArgvInput represents an input coming from the CLI arguments. + * + * Usage: + * + * $input = new ArgvInput(); + * + * By default, the `$_SERVER['argv']` array is used for the input values. + * + * This can be overridden by explicitly passing the input values in the constructor: + * + * $input = new ArgvInput($_SERVER['argv']); + * + * If you pass it yourself, don't forget that the first element of the array + * is the name of the running application. + * + * When passing an argument to the constructor, be sure that it respects + * the same rules as the argv one. It's almost always better to use the + * `StringInput` when you want to provide your own input. + * + * @author Fabien Potencier + * + * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html + * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02 + */ +class ArgvInput extends Input +{ + /** + * @var mixed[] + */ + private $tokens; + /** + * @var mixed[] + */ + private $parsed; + public function __construct(?array $argv = null, ?InputDefinition $definition = null) + { + $argv = $argv ?? $_SERVER['argv'] ?? []; + // strip the application name + \array_shift($argv); + $this->tokens = $argv; + parent::__construct($definition); + } + /** + * @return void + */ + protected function setTokens(array $tokens) + { + $this->tokens = $tokens; + } + /** + * @return void + */ + protected function parse() + { + $parseOptions = \true; + $this->parsed = $this->tokens; + while (null !== ($token = \array_shift($this->parsed))) { + $parseOptions = $this->parseToken($token, $parseOptions); + } + } + protected function parseToken(string $token, bool $parseOptions) : bool + { + if ($parseOptions && '' == $token) { + $this->parseArgument($token); + } elseif ($parseOptions && '--' == $token) { + return \false; + } elseif ($parseOptions && \strncmp($token, '--', \strlen('--')) === 0) { + $this->parseLongOption($token); + } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) { + $this->parseShortOption($token); + } else { + $this->parseArgument($token); + } + return $parseOptions; + } + /** + * Parses a short option. + */ + private function parseShortOption(string $token) : void + { + $name = \substr($token, 1); + if (\strlen($name) > 1) { + if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) { + // an option with a value (with no space) + $this->addShortOption($name[0], \substr($name, 1)); + } else { + $this->parseShortOptionSet($name); + } + } else { + $this->addShortOption($name, null); + } + } + /** + * Parses a short option set. + * + * @throws RuntimeException When option given doesn't exist + */ + private function parseShortOptionSet(string $name) : void + { + $len = \strlen($name); + for ($i = 0; $i < $len; ++$i) { + if (!$this->definition->hasShortcut($name[$i])) { + $encoding = \mb_detect_encoding($name, null, \true); + throw new RuntimeException(\sprintf('The "-%s" option does not exist.', \false === $encoding ? $name[$i] : \mb_substr($name, $i, 1, $encoding))); + } + $option = $this->definition->getOptionForShortcut($name[$i]); + if ($option->acceptValue()) { + $this->addLongOption($option->getName(), $i === $len - 1 ? null : \substr($name, $i + 1)); + break; + } else { + $this->addLongOption($option->getName(), null); + } + } + } + /** + * Parses a long option. + */ + private function parseLongOption(string $token) : void + { + $name = \substr($token, 2); + if (\false !== ($pos = \strpos($name, '='))) { + if ('' === ($value = \substr($name, $pos + 1))) { + \array_unshift($this->parsed, $value); + } + $this->addLongOption(\substr($name, 0, $pos), $value); + } else { + $this->addLongOption($name, null); + } + } + /** + * Parses an argument. + * + * @throws RuntimeException When too many arguments are given + */ + private function parseArgument(string $token) : void + { + $c = \count($this->arguments); + // if input is expecting another argument, add it + if ($this->definition->hasArgument($c)) { + $arg = $this->definition->getArgument($c); + $this->arguments[$arg->getName()] = $arg->isArray() ? [$token] : $token; + // if last argument isArray(), append token to last argument + } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { + $arg = $this->definition->getArgument($c - 1); + $this->arguments[$arg->getName()][] = $token; + // unexpected argument + } else { + $all = $this->definition->getArguments(); + $symfonyCommandName = null; + \reset($all); + if (($inputArgument = $all[$key = \key($all)] ?? null) && 'command' === $inputArgument->getName()) { + $symfonyCommandName = $this->arguments['command'] ?? null; + unset($all[$key]); + } + if (\count($all)) { + if ($symfonyCommandName) { + $message = \sprintf('Too many arguments to "%s" command, expected arguments "%s".', $symfonyCommandName, \implode('" "', \array_keys($all))); + } else { + $message = \sprintf('Too many arguments, expected arguments "%s".', \implode('" "', \array_keys($all))); + } + } elseif ($symfonyCommandName) { + $message = \sprintf('No arguments expected for "%s" command, got "%s".', $symfonyCommandName, $token); + } else { + $message = \sprintf('No arguments expected, got "%s".', $token); + } + throw new RuntimeException($message); + } + } + /** + * Adds a short option value. + * + * @throws RuntimeException When option given doesn't exist + * @param mixed $value + */ + private function addShortOption(string $shortcut, $value) : void + { + if (!$this->definition->hasShortcut($shortcut)) { + throw new RuntimeException(\sprintf('The "-%s" option does not exist.', $shortcut)); + } + $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); + } + /** + * Adds a long option value. + * + * @throws RuntimeException When option given doesn't exist + * @param mixed $value + */ + private function addLongOption(string $name, $value) : void + { + if (!$this->definition->hasOption($name)) { + if (!$this->definition->hasNegation($name)) { + throw new RuntimeException(\sprintf('The "--%s" option does not exist.', $name)); + } + $optionName = $this->definition->negationToName($name); + if (null !== $value) { + throw new RuntimeException(\sprintf('The "--%s" option does not accept a value.', $name)); + } + $this->options[$optionName] = \false; + return; + } + $option = $this->definition->getOption($name); + if (null !== $value && !$option->acceptValue()) { + throw new RuntimeException(\sprintf('The "--%s" option does not accept a value.', $name)); + } + if (\in_array($value, ['', null], \true) && $option->acceptValue() && \count($this->parsed)) { + // if option accepts an optional or mandatory argument + // let's see if there is one provided + $next = \array_shift($this->parsed); + if (isset($next[0]) && '-' !== $next[0] || \in_array($next, ['', null], \true)) { + $value = $next; + } else { + \array_unshift($this->parsed, $next); + } + } + if (null === $value) { + if ($option->isValueRequired()) { + throw new RuntimeException(\sprintf('The "--%s" option requires a value.', $name)); + } + if (!$option->isArray() && !$option->isValueOptional()) { + $value = \true; + } + } + if ($option->isArray()) { + $this->options[$name][] = $value; + } else { + $this->options[$name] = $value; + } + } + public function getFirstArgument() : ?string + { + $isOption = \false; + foreach ($this->tokens as $i => $token) { + if ($token && '-' === $token[0]) { + if (\strpos($token, '=') !== \false || !isset($this->tokens[$i + 1])) { + continue; + } + // If it's a long option, consider that everything after "--" is the option name. + // Otherwise, use the last char (if it's a short option set, only the last one can take a value with space separator) + $name = '-' === $token[1] ? \substr($token, 2) : \substr($token, -1); + if (!isset($this->options[$name]) && !$this->definition->hasShortcut($name)) { + // noop + } elseif ((isset($this->options[$name]) || isset($this->options[$name = $this->definition->shortcutToName($name)])) && $this->tokens[$i + 1] === $this->options[$name]) { + $isOption = \true; + } + continue; + } + if ($isOption) { + $isOption = \false; + continue; + } + return $token; + } + return null; + } + /** + * @param string|mixed[] $values + */ + public function hasParameterOption($values, bool $onlyParams = \false) : bool + { + $values = (array) $values; + foreach ($this->tokens as $token) { + if ($onlyParams && '--' === $token) { + return \false; + } + foreach ($values as $value) { + // Options with values: + // For long options, test for '--option=' at beginning + // For short options, test for '-o' at beginning + $leading = \strncmp($value, '--', \strlen('--')) === 0 ? $value . '=' : $value; + if ($token === $value || '' !== $leading && \strncmp($token, $leading, \strlen($leading)) === 0) { + return \true; + } + } + } + return \false; + } + /** + * @param string|mixed[] $values + * @param string|bool|int|float|mixed[]|null $default + * @return mixed + */ + public function getParameterOption($values, $default = \false, bool $onlyParams = \false) + { + $values = (array) $values; + $tokens = $this->tokens; + while (0 < \count($tokens)) { + $token = \array_shift($tokens); + if ($onlyParams && '--' === $token) { + return $default; + } + foreach ($values as $value) { + if ($token === $value) { + return \array_shift($tokens); + } + // Options with values: + // For long options, test for '--option=' at beginning + // For short options, test for '-o' at beginning + $leading = \strncmp($value, '--', \strlen('--')) === 0 ? $value . '=' : $value; + if ('' !== $leading && \strncmp($token, $leading, \strlen($leading)) === 0) { + return \substr($token, \strlen($leading)); + } + } + } + return $default; + } + /** + * Returns a stringified representation of the args passed to the command. + */ + public function __toString() : string + { + $tokens = \array_map(function ($token) { + if (\preg_match('{^(-[^=]+=)(.+)}', $token, $match)) { + return $match[1] . $this->escapeToken($match[2]); + } + if ($token && '-' !== $token[0]) { + return $this->escapeToken($token); + } + return $token; + }, $this->tokens); + return \implode(' ', $tokens); + } +} diff --git a/vendor/symfony/console/Input/ArrayInput.php b/vendor/symfony/console/Input/ArrayInput.php new file mode 100644 index 00000000..8048643f --- /dev/null +++ b/vendor/symfony/console/Input/ArrayInput.php @@ -0,0 +1,181 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Input; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidOptionException; +/** + * ArrayInput represents an input provided as an array. + * + * Usage: + * + * $input = new ArrayInput(['command' => 'foo:bar', 'foo' => 'bar', '--bar' => 'foobar']); + * + * @author Fabien Potencier + */ +class ArrayInput extends Input +{ + /** + * @var mixed[] + */ + private $parameters; + public function __construct(array $parameters, ?InputDefinition $definition = null) + { + $this->parameters = $parameters; + parent::__construct($definition); + } + public function getFirstArgument() : ?string + { + foreach ($this->parameters as $param => $value) { + if ($param && \is_string($param) && '-' === $param[0]) { + continue; + } + return $value; + } + return null; + } + /** + * @param string|mixed[] $values + */ + public function hasParameterOption($values, bool $onlyParams = \false) : bool + { + $values = (array) $values; + foreach ($this->parameters as $k => $v) { + if (!\is_int($k)) { + $v = $k; + } + if ($onlyParams && '--' === $v) { + return \false; + } + if (\in_array($v, $values)) { + return \true; + } + } + return \false; + } + /** + * @param string|mixed[] $values + * @param string|bool|int|float|mixed[]|null $default + * @return mixed + */ + public function getParameterOption($values, $default = \false, bool $onlyParams = \false) + { + $values = (array) $values; + foreach ($this->parameters as $k => $v) { + if ($onlyParams && ('--' === $k || \is_int($k) && '--' === $v)) { + return $default; + } + if (\is_int($k)) { + if (\in_array($v, $values)) { + return \true; + } + } elseif (\in_array($k, $values)) { + return $v; + } + } + return $default; + } + /** + * Returns a stringified representation of the args passed to the command. + */ + public function __toString() : string + { + $params = []; + foreach ($this->parameters as $param => $val) { + if ($param && \is_string($param) && '-' === $param[0]) { + $glue = '-' === $param[1] ? '=' : ' '; + if (\is_array($val)) { + foreach ($val as $v) { + $params[] = $param . ('' != $v ? $glue . $this->escapeToken($v) : ''); + } + } else { + $params[] = $param . ('' != $val ? $glue . $this->escapeToken($val) : ''); + } + } else { + $params[] = \is_array($val) ? \implode(' ', \array_map(\Closure::fromCallable([$this, 'escapeToken']), $val)) : $this->escapeToken($val); + } + } + return \implode(' ', $params); + } + /** + * @return void + */ + protected function parse() + { + foreach ($this->parameters as $key => $value) { + if ('--' === $key) { + return; + } + if (\strncmp($key, '--', \strlen('--')) === 0) { + $this->addLongOption(\substr($key, 2), $value); + } elseif (\strncmp($key, '-', \strlen('-')) === 0) { + $this->addShortOption(\substr($key, 1), $value); + } else { + $this->addArgument($key, $value); + } + } + } + /** + * Adds a short option value. + * + * @throws InvalidOptionException When option given doesn't exist + * @param mixed $value + */ + private function addShortOption(string $shortcut, $value) : void + { + if (!$this->definition->hasShortcut($shortcut)) { + throw new InvalidOptionException(\sprintf('The "-%s" option does not exist.', $shortcut)); + } + $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); + } + /** + * Adds a long option value. + * + * @throws InvalidOptionException When option given doesn't exist + * @throws InvalidOptionException When a required value is missing + * @param mixed $value + */ + private function addLongOption(string $name, $value) : void + { + if (!$this->definition->hasOption($name)) { + if (!$this->definition->hasNegation($name)) { + throw new InvalidOptionException(\sprintf('The "--%s" option does not exist.', $name)); + } + $optionName = $this->definition->negationToName($name); + $this->options[$optionName] = \false; + return; + } + $option = $this->definition->getOption($name); + if (null === $value) { + if ($option->isValueRequired()) { + throw new InvalidOptionException(\sprintf('The "--%s" option requires a value.', $name)); + } + if (!$option->isValueOptional()) { + $value = \true; + } + } + $this->options[$name] = $value; + } + /** + * Adds an argument value. + * + * @throws InvalidArgumentException When argument given doesn't exist + * @param string|int $name + * @param mixed $value + */ + private function addArgument($name, $value) : void + { + if (!$this->definition->hasArgument($name)) { + throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name)); + } + $this->arguments[$name] = $value; + } +} diff --git a/vendor/symfony/console/Input/Input.php b/vendor/symfony/console/Input/Input.php new file mode 100644 index 00000000..8e2b8aa5 --- /dev/null +++ b/vendor/symfony/console/Input/Input.php @@ -0,0 +1,174 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Input; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RuntimeException; +/** + * Input is the base class for all concrete Input classes. + * + * Three concrete classes are provided by default: + * + * * `ArgvInput`: The input comes from the CLI arguments (argv) + * * `StringInput`: The input is provided as a string + * * `ArrayInput`: The input is provided as an array + * + * @author Fabien Potencier + */ +abstract class Input implements InputInterface, StreamableInputInterface +{ + protected $definition; + /** @var resource */ + protected $stream; + protected $options = []; + protected $arguments = []; + protected $interactive = \true; + public function __construct(?InputDefinition $definition = null) + { + if (null === $definition) { + $this->definition = new InputDefinition(); + } else { + $this->bind($definition); + $this->validate(); + } + } + /** + * @return void + */ + public function bind(InputDefinition $definition) + { + $this->arguments = []; + $this->options = []; + $this->definition = $definition; + $this->parse(); + } + /** + * Processes command line arguments. + * + * @return void + */ + protected abstract function parse(); + /** + * @return void + */ + public function validate() + { + $definition = $this->definition; + $givenArguments = $this->arguments; + $missingArguments = \array_filter(\array_keys($definition->getArguments()), function ($argument) use($givenArguments, $definition) { + return !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired(); + }); + if (\count($missingArguments) > 0) { + throw new RuntimeException(\sprintf('Not enough arguments (missing: "%s").', \implode(', ', $missingArguments))); + } + } + public function isInteractive() : bool + { + return $this->interactive; + } + /** + * @return void + */ + public function setInteractive(bool $interactive) + { + $this->interactive = $interactive; + } + public function getArguments() : array + { + return \array_merge($this->definition->getArgumentDefaults(), $this->arguments); + } + /** + * @return mixed + */ + public function getArgument(string $name) + { + if (!$this->definition->hasArgument($name)) { + throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name)); + } + return $this->arguments[$name] ?? $this->definition->getArgument($name)->getDefault(); + } + /** + * @return void + * @param mixed $value + */ + public function setArgument(string $name, $value) + { + if (!$this->definition->hasArgument($name)) { + throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name)); + } + $this->arguments[$name] = $value; + } + public function hasArgument(string $name) : bool + { + return $this->definition->hasArgument($name); + } + public function getOptions() : array + { + return \array_merge($this->definition->getOptionDefaults(), $this->options); + } + /** + * @return mixed + */ + public function getOption(string $name) + { + if ($this->definition->hasNegation($name)) { + if (null === ($value = $this->getOption($this->definition->negationToName($name)))) { + return $value; + } + return !$value; + } + if (!$this->definition->hasOption($name)) { + throw new InvalidArgumentException(\sprintf('The "%s" option does not exist.', $name)); + } + return \array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); + } + /** + * @return void + * @param mixed $value + */ + public function setOption(string $name, $value) + { + if ($this->definition->hasNegation($name)) { + $this->options[$this->definition->negationToName($name)] = !$value; + return; + } elseif (!$this->definition->hasOption($name)) { + throw new InvalidArgumentException(\sprintf('The "%s" option does not exist.', $name)); + } + $this->options[$name] = $value; + } + public function hasOption(string $name) : bool + { + return $this->definition->hasOption($name) || $this->definition->hasNegation($name); + } + /** + * Escapes a token through escapeshellarg if it contains unsafe chars. + */ + public function escapeToken(string $token) : string + { + return \preg_match('{^[\\w-]+$}', $token) ? $token : \escapeshellarg($token); + } + /** + * @param resource $stream + * + * @return void + */ + public function setStream($stream) + { + $this->stream = $stream; + } + /** + * @return resource + */ + public function getStream() + { + return $this->stream; + } +} diff --git a/vendor/symfony/console/Input/InputArgument.php b/vendor/symfony/console/Input/InputArgument.php new file mode 100644 index 00000000..bda8a1f0 --- /dev/null +++ b/vendor/symfony/console/Input/InputArgument.php @@ -0,0 +1,155 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Input; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionInput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\Suggestion; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\LogicException; +/** + * Represents a command line argument. + * + * @author Fabien Potencier + */ +class InputArgument +{ + public const REQUIRED = 1; + public const OPTIONAL = 2; + public const IS_ARRAY = 4; + /** + * @var string + */ + private $name; + /** + * @var int + */ + private $mode; + /** + * @var string|int|bool|mixed[]|null|float + */ + private $default; + /** + * @var mixed[]|\Closure + */ + private $suggestedValues; + /** + * @var string + */ + private $description; + /** + * @param string $name The argument name + * @param int|null $mode The argument mode: a bit mask of self::REQUIRED, self::OPTIONAL and self::IS_ARRAY + * @param string $description A description text + * @param string|bool|int|float|array|null $default The default value (for self::OPTIONAL mode only) + * @param array|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion + * + * @throws InvalidArgumentException When argument mode is not valid + */ + public function __construct(string $name, ?int $mode = null, string $description = '', $default = null, $suggestedValues = []) + { + if (null === $mode) { + $mode = self::OPTIONAL; + } elseif ($mode > 7 || $mode < 1) { + throw new InvalidArgumentException(\sprintf('Argument mode "%s" is not valid.', $mode)); + } + $this->name = $name; + $this->mode = $mode; + $this->description = $description; + $this->suggestedValues = $suggestedValues; + $this->setDefault($default); + } + /** + * Returns the argument name. + */ + public function getName() : string + { + return $this->name; + } + /** + * Returns true if the argument is required. + * + * @return bool true if parameter mode is self::REQUIRED, false otherwise + */ + public function isRequired() : bool + { + return self::REQUIRED === (self::REQUIRED & $this->mode); + } + /** + * Returns true if the argument can take multiple values. + * + * @return bool true if mode is self::IS_ARRAY, false otherwise + */ + public function isArray() : bool + { + return self::IS_ARRAY === (self::IS_ARRAY & $this->mode); + } + /** + * Sets the default value. + * + * @return void + * + * @throws LogicException When incorrect default value is given + * @param string|bool|int|float|mixed[]|null $default + */ + public function setDefault($default = null) + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + if ($this->isRequired() && null !== $default) { + throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.'); + } + if ($this->isArray()) { + if (null === $default) { + $default = []; + } elseif (!\is_array($default)) { + throw new LogicException('A default value for an array argument must be an array.'); + } + } + $this->default = $default; + } + /** + * Returns the default value. + * @return string|bool|int|float|mixed[]|null + */ + public function getDefault() + { + return $this->default; + } + public function hasCompletion() : bool + { + return [] !== $this->suggestedValues; + } + /** + * Adds suggestions to $suggestions for the current completion input. + * + * @see Command::complete() + */ + public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void + { + $values = $this->suggestedValues; + if ($values instanceof \Closure && !\is_array($values = $values($input))) { + throw new LogicException(\sprintf('Closure for argument "%s" must return an array. Got "%s".', $this->name, \get_debug_type($values))); + } + if ($values) { + $suggestions->suggestValues($values); + } + } + /** + * Returns the description text. + */ + public function getDescription() : string + { + return $this->description; + } +} diff --git a/vendor/symfony/console/Input/InputAwareInterface.php b/vendor/symfony/console/Input/InputAwareInterface.php new file mode 100644 index 00000000..c3fa8034 --- /dev/null +++ b/vendor/symfony/console/Input/InputAwareInterface.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Input; + +/** + * InputAwareInterface should be implemented by classes that depends on the + * Console Input. + * + * @author Wouter J + */ +interface InputAwareInterface +{ + /** + * Sets the Console Input. + * + * @return void + */ + public function setInput(InputInterface $input); +} diff --git a/vendor/symfony/console/Input/InputDefinition.php b/vendor/symfony/console/Input/InputDefinition.php new file mode 100644 index 00000000..818ed0fc --- /dev/null +++ b/vendor/symfony/console/Input/InputDefinition.php @@ -0,0 +1,384 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Input; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\LogicException; +/** + * A InputDefinition represents a set of valid command line arguments and options. + * + * Usage: + * + * $definition = new InputDefinition([ + * new InputArgument('name', InputArgument::REQUIRED), + * new InputOption('foo', 'f', InputOption::VALUE_REQUIRED), + * ]); + * + * @author Fabien Potencier + */ +class InputDefinition +{ + /** + * @var mixed[] + */ + private $arguments = []; + /** + * @var int + */ + private $requiredCount = 0; + /** + * @var \Symfony\Component\Console\Input\InputArgument|null + */ + private $lastArrayArgument; + /** + * @var \Symfony\Component\Console\Input\InputArgument|null + */ + private $lastOptionalArgument; + /** + * @var mixed[] + */ + private $options = []; + /** + * @var mixed[] + */ + private $negations = []; + /** + * @var mixed[] + */ + private $shortcuts = []; + /** + * @param array $definition An array of InputArgument and InputOption instance + */ + public function __construct(array $definition = []) + { + $this->setDefinition($definition); + } + /** + * Sets the definition of the input. + * + * @return void + */ + public function setDefinition(array $definition) + { + $arguments = []; + $options = []; + foreach ($definition as $item) { + if ($item instanceof InputOption) { + $options[] = $item; + } else { + $arguments[] = $item; + } + } + $this->setArguments($arguments); + $this->setOptions($options); + } + /** + * Sets the InputArgument objects. + * + * @param InputArgument[] $arguments An array of InputArgument objects + * + * @return void + */ + public function setArguments(array $arguments = []) + { + $this->arguments = []; + $this->requiredCount = 0; + $this->lastOptionalArgument = null; + $this->lastArrayArgument = null; + $this->addArguments($arguments); + } + /** + * Adds an array of InputArgument objects. + * + * @param InputArgument[] $arguments An array of InputArgument objects + * + * @return void + */ + public function addArguments(?array $arguments = []) + { + if (null !== $arguments) { + foreach ($arguments as $argument) { + $this->addArgument($argument); + } + } + } + /** + * @return void + * + * @throws LogicException When incorrect argument is given + */ + public function addArgument(InputArgument $argument) + { + if (isset($this->arguments[$argument->getName()])) { + throw new LogicException(\sprintf('An argument with name "%s" already exists.', $argument->getName())); + } + if (null !== $this->lastArrayArgument) { + throw new LogicException(\sprintf('Cannot add a required argument "%s" after an array argument "%s".', $argument->getName(), $this->lastArrayArgument->getName())); + } + if ($argument->isRequired() && null !== $this->lastOptionalArgument) { + throw new LogicException(\sprintf('Cannot add a required argument "%s" after an optional one "%s".', $argument->getName(), $this->lastOptionalArgument->getName())); + } + if ($argument->isArray()) { + $this->lastArrayArgument = $argument; + } + if ($argument->isRequired()) { + ++$this->requiredCount; + } else { + $this->lastOptionalArgument = $argument; + } + $this->arguments[$argument->getName()] = $argument; + } + /** + * Returns an InputArgument by name or by position. + * + * @throws InvalidArgumentException When argument given doesn't exist + * @param string|int $name + */ + public function getArgument($name) : InputArgument + { + if (!$this->hasArgument($name)) { + throw new InvalidArgumentException(\sprintf('The "%s" argument does not exist.', $name)); + } + $arguments = \is_int($name) ? \array_values($this->arguments) : $this->arguments; + return $arguments[$name]; + } + /** + * Returns true if an InputArgument object exists by name or position. + * @param string|int $name + */ + public function hasArgument($name) : bool + { + $arguments = \is_int($name) ? \array_values($this->arguments) : $this->arguments; + return isset($arguments[$name]); + } + /** + * Gets the array of InputArgument objects. + * + * @return InputArgument[] + */ + public function getArguments() : array + { + return $this->arguments; + } + /** + * Returns the number of InputArguments. + */ + public function getArgumentCount() : int + { + return null !== $this->lastArrayArgument ? \PHP_INT_MAX : \count($this->arguments); + } + /** + * Returns the number of required InputArguments. + */ + public function getArgumentRequiredCount() : int + { + return $this->requiredCount; + } + /** + * @return array + */ + public function getArgumentDefaults() : array + { + $values = []; + foreach ($this->arguments as $argument) { + $values[$argument->getName()] = $argument->getDefault(); + } + return $values; + } + /** + * Sets the InputOption objects. + * + * @param InputOption[] $options An array of InputOption objects + * + * @return void + */ + public function setOptions(array $options = []) + { + $this->options = []; + $this->shortcuts = []; + $this->negations = []; + $this->addOptions($options); + } + /** + * Adds an array of InputOption objects. + * + * @param InputOption[] $options An array of InputOption objects + * + * @return void + */ + public function addOptions(array $options = []) + { + foreach ($options as $option) { + $this->addOption($option); + } + } + /** + * @return void + * + * @throws LogicException When option given already exist + */ + public function addOption(InputOption $option) + { + if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { + throw new LogicException(\sprintf('An option named "%s" already exists.', $option->getName())); + } + if (isset($this->negations[$option->getName()])) { + throw new LogicException(\sprintf('An option named "%s" already exists.', $option->getName())); + } + if ($option->getShortcut()) { + foreach (\explode('|', $option->getShortcut()) as $shortcut) { + if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) { + throw new LogicException(\sprintf('An option with shortcut "%s" already exists.', $shortcut)); + } + } + } + $this->options[$option->getName()] = $option; + if ($option->getShortcut()) { + foreach (\explode('|', $option->getShortcut()) as $shortcut) { + $this->shortcuts[$shortcut] = $option->getName(); + } + } + if ($option->isNegatable()) { + $negatedName = 'no-' . $option->getName(); + if (isset($this->options[$negatedName])) { + throw new LogicException(\sprintf('An option named "%s" already exists.', $negatedName)); + } + $this->negations[$negatedName] = $option->getName(); + } + } + /** + * Returns an InputOption by name. + * + * @throws InvalidArgumentException When option given doesn't exist + */ + public function getOption(string $name) : InputOption + { + if (!$this->hasOption($name)) { + throw new InvalidArgumentException(\sprintf('The "--%s" option does not exist.', $name)); + } + return $this->options[$name]; + } + /** + * Returns true if an InputOption object exists by name. + * + * This method can't be used to check if the user included the option when + * executing the command (use getOption() instead). + */ + public function hasOption(string $name) : bool + { + return isset($this->options[$name]); + } + /** + * Gets the array of InputOption objects. + * + * @return InputOption[] + */ + public function getOptions() : array + { + return $this->options; + } + /** + * Returns true if an InputOption object exists by shortcut. + */ + public function hasShortcut(string $name) : bool + { + return isset($this->shortcuts[$name]); + } + /** + * Returns true if an InputOption object exists by negated name. + */ + public function hasNegation(string $name) : bool + { + return isset($this->negations[$name]); + } + /** + * Gets an InputOption by shortcut. + */ + public function getOptionForShortcut(string $shortcut) : InputOption + { + return $this->getOption($this->shortcutToName($shortcut)); + } + /** + * @return array + */ + public function getOptionDefaults() : array + { + $values = []; + foreach ($this->options as $option) { + $values[$option->getName()] = $option->getDefault(); + } + return $values; + } + /** + * Returns the InputOption name given a shortcut. + * + * @throws InvalidArgumentException When option given does not exist + * + * @internal + */ + public function shortcutToName(string $shortcut) : string + { + if (!isset($this->shortcuts[$shortcut])) { + throw new InvalidArgumentException(\sprintf('The "-%s" option does not exist.', $shortcut)); + } + return $this->shortcuts[$shortcut]; + } + /** + * Returns the InputOption name given a negation. + * + * @throws InvalidArgumentException When option given does not exist + * + * @internal + */ + public function negationToName(string $negation) : string + { + if (!isset($this->negations[$negation])) { + throw new InvalidArgumentException(\sprintf('The "--%s" option does not exist.', $negation)); + } + return $this->negations[$negation]; + } + /** + * Gets the synopsis. + */ + public function getSynopsis(bool $short = \false) : string + { + $elements = []; + if ($short && $this->getOptions()) { + $elements[] = '[options]'; + } elseif (!$short) { + foreach ($this->getOptions() as $option) { + $value = ''; + if ($option->acceptValue()) { + $value = \sprintf(' %s%s%s', $option->isValueOptional() ? '[' : '', \strtoupper($option->getName()), $option->isValueOptional() ? ']' : ''); + } + $shortcut = $option->getShortcut() ? \sprintf('-%s|', $option->getShortcut()) : ''; + $negation = $option->isNegatable() ? \sprintf('|--no-%s', $option->getName()) : ''; + $elements[] = \sprintf('[%s--%s%s%s]', $shortcut, $option->getName(), $value, $negation); + } + } + if (\count($elements) && $this->getArguments()) { + $elements[] = '[--]'; + } + $tail = ''; + foreach ($this->getArguments() as $argument) { + $element = '<' . $argument->getName() . '>'; + if ($argument->isArray()) { + $element .= '...'; + } + if (!$argument->isRequired()) { + $element = '[' . $element; + $tail .= ']'; + } + $elements[] = $element; + } + return \implode(' ', $elements) . $tail; + } +} diff --git a/vendor/symfony/console/Input/InputInterface.php b/vendor/symfony/console/Input/InputInterface.php new file mode 100644 index 00000000..cc60e497 --- /dev/null +++ b/vendor/symfony/console/Input/InputInterface.php @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Input; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RuntimeException; +/** + * InputInterface is the interface implemented by all input classes. + * + * @author Fabien Potencier + * + * @method string __toString() Returns a stringified representation of the args passed to the command. + * InputArguments MUST be escaped as well as the InputOption values passed to the command. + */ +interface InputInterface +{ + /** + * Returns the first argument from the raw parameters (not parsed). + */ + public function getFirstArgument() : ?string; + /** + * Returns true if the raw parameters (not parsed) contain a value. + * + * This method is to be used to introspect the input parameters + * before they have been validated. It must be used carefully. + * Does not necessarily return the correct result for short options + * when multiple flags are combined in the same option. + * + * @param string|array $values The values to look for in the raw parameters (can be an array) + * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal + */ + public function hasParameterOption($values, bool $onlyParams = \false) : bool; + /** + * Returns the value of a raw option (not parsed). + * + * This method is to be used to introspect the input parameters + * before they have been validated. It must be used carefully. + * Does not necessarily return the correct result for short options + * when multiple flags are combined in the same option. + * + * @param string|array $values The value(s) to look for in the raw parameters (can be an array) + * @param string|bool|int|float|array|null $default The default value to return if no result is found + * @param bool $onlyParams Only check real parameters, skip those following an end of options (--) signal + * + * @return mixed + */ + public function getParameterOption($values, $default = \false, bool $onlyParams = \false); + /** + * Binds the current Input instance with the given arguments and options. + * + * @return void + * + * @throws RuntimeException + */ + public function bind(InputDefinition $definition); + /** + * Validates the input. + * + * @return void + * + * @throws RuntimeException When not enough arguments are given + */ + public function validate(); + /** + * Returns all the given arguments merged with the default values. + * + * @return array + */ + public function getArguments() : array; + /** + * Returns the argument value for a given argument name. + * + * @return mixed + * + * @throws InvalidArgumentException When argument given doesn't exist + */ + public function getArgument(string $name); + /** + * Sets an argument value by name. + * + * @return void + * + * @throws InvalidArgumentException When argument given doesn't exist + * @param mixed $value + */ + public function setArgument(string $name, $value); + /** + * Returns true if an InputArgument object exists by name or position. + */ + public function hasArgument(string $name) : bool; + /** + * Returns all the given options merged with the default values. + * + * @return array + */ + public function getOptions() : array; + /** + * Returns the option value for a given option name. + * + * @return mixed + * + * @throws InvalidArgumentException When option given doesn't exist + */ + public function getOption(string $name); + /** + * Sets an option value by name. + * + * @return void + * + * @throws InvalidArgumentException When option given doesn't exist + * @param mixed $value + */ + public function setOption(string $name, $value); + /** + * Returns true if an InputOption object exists by name. + */ + public function hasOption(string $name) : bool; + /** + * Is this input means interactive? + */ + public function isInteractive() : bool; + /** + * Sets the input interactivity. + * + * @return void + */ + public function setInteractive(bool $interactive); +} diff --git a/vendor/symfony/console/Input/InputOption.php b/vendor/symfony/console/Input/InputOption.php new file mode 100644 index 00000000..016ef261 --- /dev/null +++ b/vendor/symfony/console/Input/InputOption.php @@ -0,0 +1,237 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Input; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionInput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\Suggestion; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\LogicException; +/** + * Represents a command line option. + * + * @author Fabien Potencier + */ +class InputOption +{ + /** + * Do not accept input for the option (e.g. --yell). This is the default behavior of options. + */ + public const VALUE_NONE = 1; + /** + * A value must be passed when the option is used (e.g. --iterations=5 or -i5). + */ + public const VALUE_REQUIRED = 2; + /** + * The option may or may not have a value (e.g. --yell or --yell=loud). + */ + public const VALUE_OPTIONAL = 4; + /** + * The option accepts multiple values (e.g. --dir=/foo --dir=/bar). + */ + public const VALUE_IS_ARRAY = 8; + /** + * The option may have either positive or negative value (e.g. --ansi or --no-ansi). + */ + public const VALUE_NEGATABLE = 16; + /** + * @var string + */ + private $name; + /** + * @var string|mixed[]|null + */ + private $shortcut; + /** + * @var int + */ + private $mode; + /** + * @var string|int|bool|mixed[]|null|float + */ + private $default; + /** + * @var mixed[]|\Closure + */ + private $suggestedValues; + /** + * @var string + */ + private $description; + /** + * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts + * @param int|null $mode The option mode: One of the VALUE_* constants + * @param string|bool|int|float|array|null $default The default value (must be null for self::VALUE_NONE) + * @param array|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion + * + * @throws InvalidArgumentException If option mode is invalid or incompatible + */ + public function __construct(string $name, $shortcut = null, ?int $mode = null, string $description = '', $default = null, $suggestedValues = []) + { + if (\strncmp($name, '--', \strlen('--')) === 0) { + $name = \substr($name, 2); + } + if (empty($name)) { + throw new InvalidArgumentException('An option name cannot be empty.'); + } + if ('' === $shortcut || [] === $shortcut || \false === $shortcut) { + $shortcut = null; + } + if (null !== $shortcut) { + if (\is_array($shortcut)) { + $shortcut = \implode('|', $shortcut); + } + $shortcuts = \preg_split('{(\\|)-?}', \ltrim($shortcut, '-')); + $shortcuts = \array_filter($shortcuts, 'strlen'); + $shortcut = \implode('|', $shortcuts); + if ('' === $shortcut) { + throw new InvalidArgumentException('An option shortcut cannot be empty.'); + } + } + if (null === $mode) { + $mode = self::VALUE_NONE; + } elseif ($mode >= self::VALUE_NEGATABLE << 1 || $mode < 1) { + throw new InvalidArgumentException(\sprintf('Option mode "%s" is not valid.', $mode)); + } + $this->name = $name; + $this->shortcut = $shortcut; + $this->mode = $mode; + $this->description = $description; + $this->suggestedValues = $suggestedValues; + if ($suggestedValues && !$this->acceptValue()) { + throw new LogicException('Cannot set suggested values if the option does not accept a value.'); + } + if ($this->isArray() && !$this->acceptValue()) { + throw new InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.'); + } + if ($this->isNegatable() && $this->acceptValue()) { + throw new InvalidArgumentException('Impossible to have an option mode VALUE_NEGATABLE if the option also accepts a value.'); + } + $this->setDefault($default); + } + /** + * Returns the option shortcut. + */ + public function getShortcut() : ?string + { + return $this->shortcut; + } + /** + * Returns the option name. + */ + public function getName() : string + { + return $this->name; + } + /** + * Returns true if the option accepts a value. + * + * @return bool true if value mode is not self::VALUE_NONE, false otherwise + */ + public function acceptValue() : bool + { + return $this->isValueRequired() || $this->isValueOptional(); + } + /** + * Returns true if the option requires a value. + * + * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise + */ + public function isValueRequired() : bool + { + return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode); + } + /** + * Returns true if the option takes an optional value. + * + * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise + */ + public function isValueOptional() : bool + { + return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode); + } + /** + * Returns true if the option can take multiple values. + * + * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise + */ + public function isArray() : bool + { + return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode); + } + public function isNegatable() : bool + { + return self::VALUE_NEGATABLE === (self::VALUE_NEGATABLE & $this->mode); + } + /** + * @return void + * @param string|bool|int|float|mixed[]|null $default + */ + public function setDefault($default = null) + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) { + throw new LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.'); + } + if ($this->isArray()) { + if (null === $default) { + $default = []; + } elseif (!\is_array($default)) { + throw new LogicException('A default value for an array option must be an array.'); + } + } + $this->default = $this->acceptValue() || $this->isNegatable() ? $default : \false; + } + /** + * Returns the default value. + * @return string|bool|int|float|mixed[]|null + */ + public function getDefault() + { + return $this->default; + } + /** + * Returns the description text. + */ + public function getDescription() : string + { + return $this->description; + } + public function hasCompletion() : bool + { + return [] !== $this->suggestedValues; + } + /** + * Adds suggestions to $suggestions for the current completion input. + * + * @see Command::complete() + */ + public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void + { + $values = $this->suggestedValues; + if ($values instanceof \Closure && !\is_array($values = $values($input))) { + throw new LogicException(\sprintf('Closure for option "%s" must return an array. Got "%s".', $this->name, \get_debug_type($values))); + } + if ($values) { + $suggestions->suggestValues($values); + } + } + /** + * Checks whether the given option equals this one. + */ + public function equals(self $option) : bool + { + return $option->getName() === $this->getName() && $option->getShortcut() === $this->getShortcut() && $option->getDefault() === $this->getDefault() && $option->isNegatable() === $this->isNegatable() && $option->isArray() === $this->isArray() && $option->isValueRequired() === $this->isValueRequired() && $option->isValueOptional() === $this->isValueOptional(); + } +} diff --git a/vendor/symfony/console/Input/StreamableInputInterface.php b/vendor/symfony/console/Input/StreamableInputInterface.php new file mode 100644 index 00000000..9b9bef79 --- /dev/null +++ b/vendor/symfony/console/Input/StreamableInputInterface.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Input; + +/** + * StreamableInputInterface is the interface implemented by all input classes + * that have an input stream. + * + * @author Robin Chalas + */ +interface StreamableInputInterface extends InputInterface +{ + /** + * Sets the input stream to read from when interacting with the user. + * + * This is mainly useful for testing purpose. + * + * @param resource $stream The input stream + * + * @return void + */ + public function setStream($stream); + /** + * Returns the input stream. + * + * @return resource|null + */ + public function getStream(); +} diff --git a/vendor/symfony/console/Input/StringInput.php b/vendor/symfony/console/Input/StringInput.php new file mode 100644 index 00000000..54eaaf66 --- /dev/null +++ b/vendor/symfony/console/Input/StringInput.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Input; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +/** + * StringInput represents an input provided as a string. + * + * Usage: + * + * $input = new StringInput('foo --bar="foobar"'); + * + * @author Fabien Potencier + */ +class StringInput extends ArgvInput +{ + /** + * @deprecated since Symfony 6.1 + */ + public const REGEX_STRING = '([^\\s]+?)(?:\\s|(?setTokens($this->tokenize($input)); + } + /** + * Tokenizes a string. + * + * @throws InvalidArgumentException When unable to parse input (should never happen) + */ + private function tokenize(string $input) : array + { + $tokens = []; + $length = \strlen($input); + $cursor = 0; + $token = null; + while ($cursor < $length) { + if ('\\' === $input[$cursor]) { + $token .= $input[++$cursor] ?? ''; + ++$cursor; + continue; + } + if (\preg_match('/\\s+/A', $input, $match, 0, $cursor)) { + if (null !== $token) { + $tokens[] = $token; + $token = null; + } + } elseif (\preg_match('/([^="\'\\s]+?)(=?)(' . self::REGEX_QUOTED_STRING . '+)/A', $input, $match, 0, $cursor)) { + $token .= $match[1] . $match[2] . \stripcslashes(\str_replace(['"\'', '\'"', '\'\'', '""'], '', \substr($match[3], 1, -1))); + } elseif (\preg_match('/' . self::REGEX_QUOTED_STRING . '/A', $input, $match, 0, $cursor)) { + $token .= \stripcslashes(\substr($match[0], 1, -1)); + } elseif (\preg_match('/' . self::REGEX_UNQUOTED_STRING . '/A', $input, $match, 0, $cursor)) { + $token .= $match[1]; + } else { + // should never happen + throw new InvalidArgumentException(\sprintf('Unable to parse input near "... %s ...".', \substr($input, $cursor, 10))); + } + $cursor += \strlen($match[0]); + } + if (null !== $token) { + $tokens[] = $token; + } + return $tokens; + } +} diff --git a/vendor/symfony/console/LICENSE b/vendor/symfony/console/LICENSE new file mode 100644 index 00000000..0138f8f0 --- /dev/null +++ b/vendor/symfony/console/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-present Fabien Potencier + +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/symfony/console/Logger/ConsoleLogger.php b/vendor/symfony/console/Logger/ConsoleLogger.php new file mode 100644 index 00000000..1bb74fb3 --- /dev/null +++ b/vendor/symfony/console/Logger/ConsoleLogger.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Logger; + +use RuleDocGenerator202403\Psr\Log\AbstractLogger; +use RuleDocGenerator202403\Psr\Log\InvalidArgumentException; +use RuleDocGenerator202403\Psr\Log\LogLevel; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * PSR-3 compliant console logger. + * + * @author Kévin Dunglas + * + * @see https://www.php-fig.org/psr/psr-3/ + */ +class ConsoleLogger extends AbstractLogger +{ + public const INFO = 'info'; + public const ERROR = 'error'; + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $output; + /** + * @var mixed[] + */ + private $verbosityLevelMap = [LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL, LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL, LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL, LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL, LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL, LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE, LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE, LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG]; + /** + * @var mixed[] + */ + private $formatLevelMap = [LogLevel::EMERGENCY => self::ERROR, LogLevel::ALERT => self::ERROR, LogLevel::CRITICAL => self::ERROR, LogLevel::ERROR => self::ERROR, LogLevel::WARNING => self::INFO, LogLevel::NOTICE => self::INFO, LogLevel::INFO => self::INFO, LogLevel::DEBUG => self::INFO]; + /** + * @var bool + */ + private $errored = \false; + public function __construct(OutputInterface $output, array $verbosityLevelMap = [], array $formatLevelMap = []) + { + $this->output = $output; + $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap; + $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap; + } + public function log($level, $message, array $context = []) : void + { + if (!isset($this->verbosityLevelMap[$level])) { + throw new InvalidArgumentException(\sprintf('The log level "%s" does not exist.', $level)); + } + $output = $this->output; + // Write to the error output if necessary and available + if (self::ERROR === $this->formatLevelMap[$level]) { + if ($this->output instanceof ConsoleOutputInterface) { + $output = $output->getErrorOutput(); + } + $this->errored = \true; + } + // the if condition check isn't necessary -- it's the same one that $output will do internally anyway. + // We only do it for efficiency here as the message formatting is relatively expensive. + if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) { + $output->writeln(\sprintf('<%1$s>[%2$s] %3$s', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context)), $this->verbosityLevelMap[$level]); + } + } + /** + * Returns true when any messages have been logged at error levels. + */ + public function hasErrored() : bool + { + return $this->errored; + } + /** + * Interpolates context values into the message placeholders. + * + * @author PHP Framework Interoperability Group + */ + private function interpolate(string $message, array $context) : string + { + if (\strpos($message, '{') === \false) { + return $message; + } + $replacements = []; + foreach ($context as $key => $val) { + if (null === $val || \is_scalar($val) || $val instanceof \Stringable) { + $replacements["{{$key}}"] = $val; + } elseif ($val instanceof \DateTimeInterface) { + $replacements["{{$key}}"] = $val->format(\DateTimeInterface::RFC3339); + } elseif (\is_object($val)) { + $replacements["{{$key}}"] = '[object ' . \get_class($val) . ']'; + } else { + $replacements["{{$key}}"] = '[' . \gettype($val) . ']'; + } + } + return \strtr($message, $replacements); + } +} diff --git a/vendor/symfony/console/Messenger/RunCommandContext.php b/vendor/symfony/console/Messenger/RunCommandContext.php new file mode 100644 index 00000000..c72bee7e --- /dev/null +++ b/vendor/symfony/console/Messenger/RunCommandContext.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Messenger; + +/** + * @author Kevin Bond + */ +final class RunCommandContext +{ + /** + * @readonly + * @var \Symfony\Component\Console\Messenger\RunCommandMessage + */ + public $message; + /** + * @readonly + * @var int + */ + public $exitCode; + /** + * @readonly + * @var string + */ + public $output; + public function __construct(RunCommandMessage $message, int $exitCode, string $output) + { + $this->message = $message; + $this->exitCode = $exitCode; + $this->output = $output; + } +} diff --git a/vendor/symfony/console/Messenger/RunCommandMessage.php b/vendor/symfony/console/Messenger/RunCommandMessage.php new file mode 100644 index 00000000..23103aca --- /dev/null +++ b/vendor/symfony/console/Messenger/RunCommandMessage.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Messenger; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RunCommandFailedException; +/** + * @author Kevin Bond + */ +class RunCommandMessage +{ + /** + * @readonly + * @var string + */ + public $input; + /** + * @var bool + * @readonly + */ + public $throwOnFailure = \true; + /** + * @var bool + * @readonly + */ + public $catchExceptions = \false; + /** + * @param bool $throwOnFailure If the command has a non-zero exit code, throw {@see RunCommandFailedException} + * @param bool $catchExceptions @see Application::setCatchExceptions() + */ + public function __construct(string $input, bool $throwOnFailure = \true, bool $catchExceptions = \false) + { + $this->input = $input; + $this->throwOnFailure = $throwOnFailure; + $this->catchExceptions = $catchExceptions; + } + public function __toString() : string + { + return $this->input; + } +} diff --git a/vendor/symfony/console/Messenger/RunCommandMessageHandler.php b/vendor/symfony/console/Messenger/RunCommandMessageHandler.php new file mode 100644 index 00000000..ecd927a9 --- /dev/null +++ b/vendor/symfony/console/Messenger/RunCommandMessageHandler.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Messenger; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RunCommandFailedException; +use RuleDocGenerator202403\Symfony\Component\Console\Input\StringInput; +use RuleDocGenerator202403\Symfony\Component\Console\Output\BufferedOutput; +/** + * @author Kevin Bond + */ +final class RunCommandMessageHandler +{ + /** + * @readonly + * @var \Symfony\Component\Console\Application + */ + private $application; + public function __construct(Application $application) + { + $this->application = $application; + } + public function __invoke(RunCommandMessage $message) : RunCommandContext + { + $input = new StringInput($message->input); + $output = new BufferedOutput(); + $this->application->setCatchExceptions($message->catchExceptions); + try { + $exitCode = $this->application->run($input, $output); + } catch (\Throwable $e) { + throw new RunCommandFailedException($e, new RunCommandContext($message, Command::FAILURE, $output->fetch())); + } + if ($message->throwOnFailure && Command::SUCCESS !== $exitCode) { + throw new RunCommandFailedException(\sprintf('Command "%s" exited with code "%s".', $message->input, $exitCode), new RunCommandContext($message, $exitCode, $output->fetch())); + } + return new RunCommandContext($message, $exitCode, $output->fetch()); + } +} diff --git a/vendor/symfony/console/Output/AnsiColorMode.php b/vendor/symfony/console/Output/AnsiColorMode.php new file mode 100644 index 00000000..4410cf97 --- /dev/null +++ b/vendor/symfony/console/Output/AnsiColorMode.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +class AnsiColorMode +{ + public const Ansi4 = 'ansi4'; + public const Ansi8 = 'ansi8'; + public const Ansi24 = 'ansi24'; + /** + * Converts an RGB hexadecimal color to the corresponding Ansi code. + */ + public function convertFromHexToAnsiColorCode(string $hexColor) : string + { + $hexColor = \str_replace('#', '', $hexColor); + if (3 === \strlen($hexColor)) { + $hexColor = $hexColor[0] . $hexColor[0] . $hexColor[1] . $hexColor[1] . $hexColor[2] . $hexColor[2]; + } + if (6 !== \strlen($hexColor)) { + throw new InvalidArgumentException(\sprintf('Invalid "#%s" color.', $hexColor)); + } + $color = \hexdec($hexColor); + $r = $color >> 16 & 255; + $g = $color >> 8 & 255; + $b = $color & 255; + switch ($this) { + case self::Ansi4: + return (string) $this->convertFromRGB($r, $g, $b); + case self::Ansi8: + return '8;5;' . (string) $this->convertFromRGB($r, $g, $b); + case self::Ansi24: + return \sprintf('8;2;%d;%d;%d', $r, $g, $b); + } + } + private function convertFromRGB(int $r, int $g, int $b) : int + { + switch ($this) { + case self::Ansi4: + return $this->degradeHexColorToAnsi4($r, $g, $b); + case self::Ansi8: + return $this->degradeHexColorToAnsi8($r, $g, $b); + default: + throw new InvalidArgumentException("RGB cannot be converted to {$this->name}."); + } + } + private function degradeHexColorToAnsi4(int $r, int $g, int $b) : int + { + return \round($b / 255) << 2 | \round($g / 255) << 1 | \round($r / 255); + } + /** + * Inspired from https://github.com/ajalt/colormath/blob/e464e0da1b014976736cf97250063248fc77b8e7/colormath/src/commonMain/kotlin/com/github/ajalt/colormath/model/Ansi256.kt code (MIT license). + */ + private function degradeHexColorToAnsi8(int $r, int $g, int $b) : int + { + if ($r === $g && $g === $b) { + if ($r < 8) { + return 16; + } + if ($r > 248) { + return 231; + } + return (int) \round(($r - 8) / 247 * 24) + 232; + } else { + return 16 + 36 * (int) \round($r / 255 * 5) + 6 * (int) \round($g / 255 * 5) + (int) \round($b / 255 * 5); + } + } +} diff --git a/vendor/symfony/console/Output/BufferedOutput.php b/vendor/symfony/console/Output/BufferedOutput.php new file mode 100644 index 00000000..8ed62a19 --- /dev/null +++ b/vendor/symfony/console/Output/BufferedOutput.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Output; + +/** + * @author Jean-François Simon + */ +class BufferedOutput extends Output +{ + /** + * @var string + */ + private $buffer = ''; + /** + * Empties buffer and returns its content. + */ + public function fetch() : string + { + $content = $this->buffer; + $this->buffer = ''; + return $content; + } + /** + * @return void + */ + protected function doWrite(string $message, bool $newline) + { + $this->buffer .= $message; + if ($newline) { + $this->buffer .= \PHP_EOL; + } + } +} diff --git a/vendor/symfony/console/Output/ConsoleOutput.php b/vendor/symfony/console/Output/ConsoleOutput.php new file mode 100644 index 00000000..3c507632 --- /dev/null +++ b/vendor/symfony/console/Output/ConsoleOutput.php @@ -0,0 +1,146 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatterInterface; +/** + * ConsoleOutput is the default class for all CLI output. It uses STDOUT and STDERR. + * + * This class is a convenient wrapper around `StreamOutput` for both STDOUT and STDERR. + * + * $output = new ConsoleOutput(); + * + * This is equivalent to: + * + * $output = new StreamOutput(fopen('php://stdout', 'w')); + * $stdErr = new StreamOutput(fopen('php://stderr', 'w')); + * + * @author Fabien Potencier + */ +class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface +{ + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $stderr; + /** + * @var mixed[] + */ + private $consoleSectionOutputs = []; + /** + * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) + * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) + * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) + */ + public function __construct(int $verbosity = self::VERBOSITY_NORMAL, ?bool $decorated = null, ?OutputFormatterInterface $formatter = null) + { + parent::__construct($this->openOutputStream(), $verbosity, $decorated, $formatter); + if (null === $formatter) { + // for BC reasons, stdErr has it own Formatter only when user don't inject a specific formatter. + $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated); + return; + } + $actualDecorated = $this->isDecorated(); + $this->stderr = new StreamOutput($this->openErrorStream(), $verbosity, $decorated, $this->getFormatter()); + if (null === $decorated) { + $this->setDecorated($actualDecorated && $this->stderr->isDecorated()); + } + } + /** + * Creates a new output section. + */ + public function section() : ConsoleSectionOutput + { + return new ConsoleSectionOutput($this->getStream(), $this->consoleSectionOutputs, $this->getVerbosity(), $this->isDecorated(), $this->getFormatter()); + } + /** + * @return void + */ + public function setDecorated(bool $decorated) + { + parent::setDecorated($decorated); + $this->stderr->setDecorated($decorated); + } + /** + * @return void + */ + public function setFormatter(OutputFormatterInterface $formatter) + { + parent::setFormatter($formatter); + $this->stderr->setFormatter($formatter); + } + /** + * @return void + */ + public function setVerbosity(int $level) + { + parent::setVerbosity($level); + $this->stderr->setVerbosity($level); + } + public function getErrorOutput() : OutputInterface + { + return $this->stderr; + } + /** + * @return void + */ + public function setErrorOutput(OutputInterface $error) + { + $this->stderr = $error; + } + /** + * Returns true if current environment supports writing console output to + * STDOUT. + */ + protected function hasStdoutSupport() : bool + { + return \false === $this->isRunningOS400(); + } + /** + * Returns true if current environment supports writing console output to + * STDERR. + */ + protected function hasStderrSupport() : bool + { + return \false === $this->isRunningOS400(); + } + /** + * Checks if current executing environment is IBM iSeries (OS400), which + * doesn't properly convert character-encodings between ASCII to EBCDIC. + */ + private function isRunningOS400() : bool + { + $checks = [\function_exists('php_uname') ? \php_uname('s') : '', \getenv('OSTYPE'), \PHP_OS]; + return \false !== \stripos(\implode(';', $checks), 'OS400'); + } + /** + * @return resource + */ + private function openOutputStream() + { + if (!$this->hasStdoutSupport()) { + return \fopen('php://output', 'w'); + } + // Use STDOUT when possible to prevent from opening too many file descriptors + return \defined('STDOUT') ? \STDOUT : (@\fopen('php://stdout', 'w') ?: \fopen('php://output', 'w')); + } + /** + * @return resource + */ + private function openErrorStream() + { + if (!$this->hasStderrSupport()) { + return \fopen('php://output', 'w'); + } + // Use STDERR when possible to prevent from opening too many file descriptors + return \defined('STDERR') ? \STDERR : (@\fopen('php://stderr', 'w') ?: \fopen('php://output', 'w')); + } +} diff --git a/vendor/symfony/console/Output/ConsoleOutputInterface.php b/vendor/symfony/console/Output/ConsoleOutputInterface.php new file mode 100644 index 00000000..9be899ae --- /dev/null +++ b/vendor/symfony/console/Output/ConsoleOutputInterface.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Output; + +/** + * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. + * This adds information about stderr and section output stream. + * + * @author Dariusz Górecki + */ +interface ConsoleOutputInterface extends OutputInterface +{ + /** + * Gets the OutputInterface for errors. + */ + public function getErrorOutput() : OutputInterface; + /** + * @return void + */ + public function setErrorOutput(OutputInterface $error); + public function section() : ConsoleSectionOutput; +} diff --git a/vendor/symfony/console/Output/ConsoleSectionOutput.php b/vendor/symfony/console/Output/ConsoleSectionOutput.php new file mode 100644 index 00000000..b84ab4dd --- /dev/null +++ b/vendor/symfony/console/Output/ConsoleSectionOutput.php @@ -0,0 +1,222 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\Helper; +use RuleDocGenerator202403\Symfony\Component\Console\Terminal; +/** + * @author Pierre du Plessis + * @author Gabriel Ostrolucký + */ +class ConsoleSectionOutput extends StreamOutput +{ + /** + * @var mixed[] + */ + private $content = []; + /** + * @var int + */ + private $lines = 0; + /** + * @var mixed[] + */ + private $sections; + /** + * @var \Symfony\Component\Console\Terminal + */ + private $terminal; + /** + * @var int + */ + private $maxHeight = 0; + /** + * @param resource $stream + * @param ConsoleSectionOutput[] $sections + */ + public function __construct($stream, array &$sections, int $verbosity, bool $decorated, OutputFormatterInterface $formatter) + { + parent::__construct($stream, $verbosity, $decorated, $formatter); + \array_unshift($sections, $this); + $this->sections =& $sections; + $this->terminal = new Terminal(); + } + /** + * Defines a maximum number of lines for this section. + * + * When more lines are added, the section will automatically scroll to the + * end (i.e. remove the first lines to comply with the max height). + */ + public function setMaxHeight(int $maxHeight) : void + { + // when changing max height, clear output of current section and redraw again with the new height + $previousMaxHeight = $this->maxHeight; + $this->maxHeight = $maxHeight; + $existingContent = $this->popStreamContentUntilCurrentSection($previousMaxHeight ? \min($previousMaxHeight, $this->lines) : $this->lines); + parent::doWrite($this->getVisibleContent(), \false); + parent::doWrite($existingContent, \false); + } + /** + * Clears previous output for this section. + * + * @param int $lines Number of lines to clear. If null, then the entire output of this section is cleared + * + * @return void + */ + public function clear(?int $lines = null) + { + if (empty($this->content) || !$this->isDecorated()) { + return; + } + if ($lines) { + \array_splice($this->content, -$lines); + } else { + $lines = $this->lines; + $this->content = []; + } + $this->lines -= $lines; + parent::doWrite($this->popStreamContentUntilCurrentSection($this->maxHeight ? \min($this->maxHeight, $lines) : $lines), \false); + } + /** + * Overwrites the previous output with a new message. + * + * @return void + * @param string|iterable $message + */ + public function overwrite($message) + { + $this->clear(); + $this->writeln($message); + } + public function getContent() : string + { + return \implode('', $this->content); + } + public function getVisibleContent() : string + { + if (0 === $this->maxHeight) { + return $this->getContent(); + } + return \implode('', \array_slice($this->content, -$this->maxHeight)); + } + /** + * @internal + */ + public function addContent(string $input, bool $newline = \true) : int + { + $width = $this->terminal->getWidth(); + $lines = \explode(\PHP_EOL, $input); + $linesAdded = 0; + $count = \count($lines) - 1; + foreach ($lines as $i => $lineContent) { + // re-add the line break (that has been removed in the above `explode()` for + // - every line that is not the last line + // - if $newline is required, also add it to the last line + if ($i < $count || $newline) { + $lineContent .= \PHP_EOL; + } + // skip line if there is no text (or newline for that matter) + if ('' === $lineContent) { + continue; + } + // For the first line, check if the previous line (last entry of `$this->content`) + // needs to be continued (i.e. does not end with a line break). + if (0 === $i && \false !== ($lastLine = \end($this->content)) && \substr_compare($lastLine, \PHP_EOL, -\strlen(\PHP_EOL)) !== 0) { + // deduct the line count of the previous line + $this->lines -= (int) \ceil($this->getDisplayLength($lastLine) / $width) ?: 1; + // concatenate previous and new line + $lineContent = $lastLine . $lineContent; + // replace last entry of `$this->content` with the new expanded line + \array_splice($this->content, -1, 1, $lineContent); + } else { + // otherwise just add the new content + $this->content[] = $lineContent; + } + $linesAdded += (int) \ceil($this->getDisplayLength($lineContent) / $width) ?: 1; + } + $this->lines += $linesAdded; + return $linesAdded; + } + /** + * @internal + */ + public function addNewLineOfInputSubmit() : void + { + $this->content[] = \PHP_EOL; + ++$this->lines; + } + /** + * @return void + */ + protected function doWrite(string $message, bool $newline) + { + // Simulate newline behavior for consistent output formatting, avoiding extra logic + if (!$newline && \substr_compare($message, \PHP_EOL, -\strlen(\PHP_EOL)) === 0) { + $message = \substr($message, 0, -\strlen(\PHP_EOL)); + $newline = \true; + } + if (!$this->isDecorated()) { + parent::doWrite($message, $newline); + return; + } + // Check if the previous line (last entry of `$this->content`) needs to be continued + // (i.e. does not end with a line break). In which case, it needs to be erased first. + $linesToClear = $deleteLastLine = ($lastLine = \end($this->content) ?: '') && \substr_compare($lastLine, \PHP_EOL, -\strlen(\PHP_EOL)) !== 0 ? 1 : 0; + $linesAdded = $this->addContent($message, $newline); + if ($lineOverflow = $this->maxHeight > 0 && $this->lines > $this->maxHeight) { + // on overflow, clear the whole section and redraw again (to remove the first lines) + $linesToClear = $this->maxHeight; + } + $erasedContent = $this->popStreamContentUntilCurrentSection($linesToClear); + if ($lineOverflow) { + // redraw existing lines of the section + $previousLinesOfSection = \array_slice($this->content, $this->lines - $this->maxHeight, $this->maxHeight - $linesAdded); + parent::doWrite(\implode('', $previousLinesOfSection), \false); + } + // if the last line was removed, re-print its content together with the new content. + // otherwise, just print the new content. + parent::doWrite($deleteLastLine ? $lastLine . $message : $message, \true); + parent::doWrite($erasedContent, \false); + } + /** + * At initial stage, cursor is at the end of stream output. This method makes cursor crawl upwards until it hits + * current section. Then it erases content it crawled through. Optionally, it erases part of current section too. + */ + private function popStreamContentUntilCurrentSection(int $numberOfLinesToClearFromCurrentSection = 0) : string + { + $numberOfLinesToClear = $numberOfLinesToClearFromCurrentSection; + $erasedContent = []; + foreach ($this->sections as $section) { + if ($section === $this) { + break; + } + $numberOfLinesToClear += $section->maxHeight ? \min($section->lines, $section->maxHeight) : $section->lines; + if ('' !== ($sectionContent = $section->getVisibleContent())) { + if (\substr_compare($sectionContent, \PHP_EOL, -\strlen(\PHP_EOL)) !== 0) { + $sectionContent .= \PHP_EOL; + } + $erasedContent[] = $sectionContent; + } + } + if ($numberOfLinesToClear > 0) { + // move cursor up n lines + parent::doWrite(\sprintf("\x1b[%dA", $numberOfLinesToClear), \false); + // erase to end of screen + parent::doWrite("\x1b[0J", \false); + } + return \implode('', \array_reverse($erasedContent)); + } + private function getDisplayLength(string $text) : int + { + return Helper::width(Helper::removeDecoration($this->getFormatter(), \str_replace("\t", ' ', $text))); + } +} diff --git a/vendor/symfony/console/Output/NullOutput.php b/vendor/symfony/console/Output/NullOutput.php new file mode 100644 index 00000000..726cf7c5 --- /dev/null +++ b/vendor/symfony/console/Output/NullOutput.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\NullOutputFormatter; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatterInterface; +/** + * NullOutput suppresses all output. + * + * $output = new NullOutput(); + * + * @author Fabien Potencier + * @author Tobias Schultze + */ +class NullOutput implements OutputInterface +{ + /** + * @var \Symfony\Component\Console\Formatter\NullOutputFormatter + */ + private $formatter; + /** + * @return void + */ + public function setFormatter(OutputFormatterInterface $formatter) + { + // do nothing + } + public function getFormatter() : OutputFormatterInterface + { + // to comply with the interface we must return a OutputFormatterInterface + return $this->formatter = $this->formatter ?? new NullOutputFormatter(); + } + /** + * @return void + */ + public function setDecorated(bool $decorated) + { + // do nothing + } + public function isDecorated() : bool + { + return \false; + } + /** + * @return void + */ + public function setVerbosity(int $level) + { + // do nothing + } + public function getVerbosity() : int + { + return self::VERBOSITY_QUIET; + } + public function isQuiet() : bool + { + return \true; + } + public function isVerbose() : bool + { + return \false; + } + public function isVeryVerbose() : bool + { + return \false; + } + public function isDebug() : bool + { + return \false; + } + /** + * @return void + * @param string|iterable $messages + */ + public function writeln($messages, int $options = self::OUTPUT_NORMAL) + { + // do nothing + } + /** + * @return void + * @param string|iterable $messages + */ + public function write($messages, bool $newline = \false, int $options = self::OUTPUT_NORMAL) + { + // do nothing + } +} diff --git a/vendor/symfony/console/Output/Output.php b/vendor/symfony/console/Output/Output.php new file mode 100644 index 00000000..123f4d83 --- /dev/null +++ b/vendor/symfony/console/Output/Output.php @@ -0,0 +1,142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatter; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatterInterface; +/** + * Base class for output classes. + * + * There are five levels of verbosity: + * + * * normal: no option passed (normal output) + * * verbose: -v (more output) + * * very verbose: -vv (highly extended output) + * * debug: -vvv (all debug output) + * * quiet: -q (no output) + * + * @author Fabien Potencier + */ +abstract class Output implements OutputInterface +{ + /** + * @var int + */ + private $verbosity; + /** + * @var \Symfony\Component\Console\Formatter\OutputFormatterInterface + */ + private $formatter; + /** + * @param int|null $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) + * @param bool $decorated Whether to decorate messages + * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) + */ + public function __construct(?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = \false, ?OutputFormatterInterface $formatter = null) + { + $this->verbosity = $verbosity ?? self::VERBOSITY_NORMAL; + $this->formatter = $formatter ?? new OutputFormatter(); + $this->formatter->setDecorated($decorated); + } + /** + * @return void + */ + public function setFormatter(OutputFormatterInterface $formatter) + { + $this->formatter = $formatter; + } + public function getFormatter() : OutputFormatterInterface + { + return $this->formatter; + } + /** + * @return void + */ + public function setDecorated(bool $decorated) + { + $this->formatter->setDecorated($decorated); + } + public function isDecorated() : bool + { + return $this->formatter->isDecorated(); + } + /** + * @return void + */ + public function setVerbosity(int $level) + { + $this->verbosity = $level; + } + public function getVerbosity() : int + { + return $this->verbosity; + } + public function isQuiet() : bool + { + return self::VERBOSITY_QUIET === $this->verbosity; + } + public function isVerbose() : bool + { + return self::VERBOSITY_VERBOSE <= $this->verbosity; + } + public function isVeryVerbose() : bool + { + return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity; + } + public function isDebug() : bool + { + return self::VERBOSITY_DEBUG <= $this->verbosity; + } + /** + * @return void + * @param string|iterable $messages + */ + public function writeln($messages, int $options = self::OUTPUT_NORMAL) + { + $this->write($messages, \true, $options); + } + /** + * @return void + * @param string|iterable $messages + */ + public function write($messages, bool $newline = \false, int $options = self::OUTPUT_NORMAL) + { + if (!\is_iterable($messages)) { + $messages = [$messages]; + } + $types = self::OUTPUT_NORMAL | self::OUTPUT_RAW | self::OUTPUT_PLAIN; + $type = $types & $options ?: self::OUTPUT_NORMAL; + $verbosities = self::VERBOSITY_QUIET | self::VERBOSITY_NORMAL | self::VERBOSITY_VERBOSE | self::VERBOSITY_VERY_VERBOSE | self::VERBOSITY_DEBUG; + $verbosity = $verbosities & $options ?: self::VERBOSITY_NORMAL; + if ($verbosity > $this->getVerbosity()) { + return; + } + foreach ($messages as $message) { + switch ($type) { + case OutputInterface::OUTPUT_NORMAL: + $message = $this->formatter->format($message); + break; + case OutputInterface::OUTPUT_RAW: + break; + case OutputInterface::OUTPUT_PLAIN: + $message = \strip_tags($this->formatter->format($message)); + break; + } + $this->doWrite($message ?? '', $newline); + } + } + /** + * Writes a message to the output. + * + * @return void + */ + protected abstract function doWrite(string $message, bool $newline); +} diff --git a/vendor/symfony/console/Output/OutputInterface.php b/vendor/symfony/console/Output/OutputInterface.php new file mode 100644 index 00000000..17fc488c --- /dev/null +++ b/vendor/symfony/console/Output/OutputInterface.php @@ -0,0 +1,98 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatterInterface; +/** + * OutputInterface is the interface implemented by all Output classes. + * + * @author Fabien Potencier + */ +interface OutputInterface +{ + public const VERBOSITY_QUIET = 16; + public const VERBOSITY_NORMAL = 32; + public const VERBOSITY_VERBOSE = 64; + public const VERBOSITY_VERY_VERBOSE = 128; + public const VERBOSITY_DEBUG = 256; + public const OUTPUT_NORMAL = 1; + public const OUTPUT_RAW = 2; + public const OUTPUT_PLAIN = 4; + /** + * Writes a message to the output. + * + * @param bool $newline Whether to add a newline + * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), + * 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL + * + * @return void + * @param string|iterable $messages + */ + public function write($messages, bool $newline = \false, int $options = 0); + /** + * Writes a message to the output and adds a newline at the end. + * + * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), + * 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL + * + * @return void + * @param string|iterable $messages + */ + public function writeln($messages, int $options = 0); + /** + * Sets the verbosity of the output. + * + * @param self::VERBOSITY_* $level + * + * @return void + */ + public function setVerbosity(int $level); + /** + * Gets the current verbosity of the output. + * + * @return self::VERBOSITY_* + */ + public function getVerbosity() : int; + /** + * Returns whether verbosity is quiet (-q). + */ + public function isQuiet() : bool; + /** + * Returns whether verbosity is verbose (-v). + */ + public function isVerbose() : bool; + /** + * Returns whether verbosity is very verbose (-vv). + */ + public function isVeryVerbose() : bool; + /** + * Returns whether verbosity is debug (-vvv). + */ + public function isDebug() : bool; + /** + * Sets the decorated flag. + * + * @return void + */ + public function setDecorated(bool $decorated); + /** + * Gets the decorated flag. + */ + public function isDecorated() : bool; + /** + * @return void + */ + public function setFormatter(OutputFormatterInterface $formatter); + /** + * Returns current output formatter instance. + */ + public function getFormatter() : OutputFormatterInterface; +} diff --git a/vendor/symfony/console/Output/StreamOutput.php b/vendor/symfony/console/Output/StreamOutput.php new file mode 100644 index 00000000..53ea315f --- /dev/null +++ b/vendor/symfony/console/Output/StreamOutput.php @@ -0,0 +1,105 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatterInterface; +/** + * StreamOutput writes the output to a given stream. + * + * Usage: + * + * $output = new StreamOutput(fopen('php://stdout', 'w')); + * + * As `StreamOutput` can use any stream, you can also use a file: + * + * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false)); + * + * @author Fabien Potencier + */ +class StreamOutput extends Output +{ + /** @var resource */ + private $stream; + /** + * @param resource $stream A stream resource + * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) + * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) + * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) + * + * @throws InvalidArgumentException When first argument is not a real stream + */ + public function __construct($stream, int $verbosity = self::VERBOSITY_NORMAL, ?bool $decorated = null, ?OutputFormatterInterface $formatter = null) + { + if (!\is_resource($stream) || 'stream' !== \get_resource_type($stream)) { + throw new InvalidArgumentException('The StreamOutput class needs a stream as its first argument.'); + } + $this->stream = $stream; + $decorated = $decorated ?? $this->hasColorSupport(); + parent::__construct($verbosity, $decorated, $formatter); + } + /** + * Gets the stream attached to this StreamOutput instance. + * + * @return resource + */ + public function getStream() + { + return $this->stream; + } + /** + * @return void + */ + protected function doWrite(string $message, bool $newline) + { + if ($newline) { + $message .= \PHP_EOL; + } + @\fwrite($this->stream, $message); + \fflush($this->stream); + } + /** + * Returns true if the stream supports colorization. + * + * Colorization is disabled if not supported by the stream: + * + * This is tricky on Windows, because Cygwin, Msys2 etc emulate pseudo + * terminals via named pipes, so we can only check the environment. + * + * Reference: Composer\XdebugHandler\Process::supportsColor + * https://github.com/composer/xdebug-handler + * + * @return bool true if the stream supports colorization, false otherwise + */ + protected function hasColorSupport() : bool + { + // Follow https://no-color.org/ + if (isset($_SERVER['NO_COLOR']) || \false !== \getenv('NO_COLOR')) { + return \false; + } + // Detect msysgit/mingw and assume this is a tty because detection + // does not work correctly, see https://github.com/composer/composer/issues/9690 + if (!@\stream_isatty($this->stream) && !\in_array(\strtoupper((string) \getenv('MSYSTEM')), ['MINGW32', 'MINGW64'], \true)) { + return \false; + } + if ('\\' === \DIRECTORY_SEPARATOR && @\sapi_windows_vt100_support($this->stream)) { + return \true; + } + if ('Hyper' === \getenv('TERM_PROGRAM') || \false !== \getenv('COLORTERM') || \false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI')) { + return \true; + } + if ('dumb' === ($term = (string) \getenv('TERM'))) { + return \false; + } + // See https://github.com/chalk/supports-color/blob/d4f413efaf8da045c5ab440ed418ef02dbb28bf1/index.js#L157 + return \preg_match('/^((screen|xterm|vt100|vt220|putty|rxvt|ansi|cygwin|linux).*)|(.*-256(color)?(-bce)?)$/', $term); + } +} diff --git a/vendor/symfony/console/Output/TrimmedBufferOutput.php b/vendor/symfony/console/Output/TrimmedBufferOutput.php new file mode 100644 index 00000000..994b8a4c --- /dev/null +++ b/vendor/symfony/console/Output/TrimmedBufferOutput.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Output; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatterInterface; +/** + * A BufferedOutput that keeps only the last N chars. + * + * @author Jérémy Derussé + */ +class TrimmedBufferOutput extends Output +{ + /** + * @var int + */ + private $maxLength; + /** + * @var string + */ + private $buffer = ''; + public function __construct(int $maxLength, ?int $verbosity = self::VERBOSITY_NORMAL, bool $decorated = \false, ?OutputFormatterInterface $formatter = null) + { + if ($maxLength <= 0) { + throw new InvalidArgumentException(\sprintf('"%s()" expects a strictly positive maxLength. Got %d.', __METHOD__, $maxLength)); + } + parent::__construct($verbosity, $decorated, $formatter); + $this->maxLength = $maxLength; + } + /** + * Empties buffer and returns its content. + */ + public function fetch() : string + { + $content = $this->buffer; + $this->buffer = ''; + return $content; + } + /** + * @return void + */ + protected function doWrite(string $message, bool $newline) + { + $this->buffer .= $message; + if ($newline) { + $this->buffer .= \PHP_EOL; + } + $this->buffer = \substr($this->buffer, 0 - $this->maxLength); + } +} diff --git a/vendor/symfony/console/Question/ChoiceQuestion.php b/vendor/symfony/console/Question/ChoiceQuestion.php new file mode 100644 index 00000000..05b4a2be --- /dev/null +++ b/vendor/symfony/console/Question/ChoiceQuestion.php @@ -0,0 +1,163 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Question; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +/** + * Represents a choice question. + * + * @author Fabien Potencier + */ +class ChoiceQuestion extends Question +{ + /** + * @var mixed[] + */ + private $choices; + /** + * @var bool + */ + private $multiselect = \false; + /** + * @var string + */ + private $prompt = ' > '; + /** + * @var string + */ + private $errorMessage = 'Value "%s" is invalid'; + /** + * @param string $question The question to ask to the user + * @param array $choices The list of available choices + * @param mixed $default The default answer to return + */ + public function __construct(string $question, array $choices, $default = null) + { + if (!$choices) { + throw new \LogicException('Choice question must have at least 1 choice available.'); + } + parent::__construct($question, $default); + $this->choices = $choices; + $this->setValidator($this->getDefaultValidator()); + $this->setAutocompleterValues($choices); + } + /** + * Returns available choices. + */ + public function getChoices() : array + { + return $this->choices; + } + /** + * Sets multiselect option. + * + * When multiselect is set to true, multiple choices can be answered. + * + * @return $this + */ + public function setMultiselect(bool $multiselect) + { + $this->multiselect = $multiselect; + $this->setValidator($this->getDefaultValidator()); + return $this; + } + /** + * Returns whether the choices are multiselect. + */ + public function isMultiselect() : bool + { + return $this->multiselect; + } + /** + * Gets the prompt for choices. + */ + public function getPrompt() : string + { + return $this->prompt; + } + /** + * Sets the prompt for choices. + * + * @return $this + */ + public function setPrompt(string $prompt) + { + $this->prompt = $prompt; + return $this; + } + /** + * Sets the error message for invalid values. + * + * The error message has a string placeholder (%s) for the invalid value. + * + * @return $this + */ + public function setErrorMessage(string $errorMessage) + { + $this->errorMessage = $errorMessage; + $this->setValidator($this->getDefaultValidator()); + return $this; + } + private function getDefaultValidator() : callable + { + $choices = $this->choices; + $errorMessage = $this->errorMessage; + $multiselect = $this->multiselect; + $isAssoc = $this->isAssoc($choices); + return function ($selected) use($choices, $errorMessage, $multiselect, $isAssoc) { + if ($multiselect) { + // Check for a separated comma values + if (!\preg_match('/^[^,]+(?:,[^,]+)*$/', (string) $selected, $matches)) { + throw new InvalidArgumentException(\sprintf($errorMessage, $selected)); + } + $selectedChoices = \explode(',', (string) $selected); + } else { + $selectedChoices = [$selected]; + } + if ($this->isTrimmable()) { + foreach ($selectedChoices as $k => $v) { + $selectedChoices[$k] = \trim((string) $v); + } + } + $multiselectChoices = []; + foreach ($selectedChoices as $value) { + $results = []; + foreach ($choices as $key => $choice) { + if ($choice === $value) { + $results[] = $key; + } + } + if (\count($results) > 1) { + throw new InvalidArgumentException(\sprintf('The provided answer is ambiguous. Value should be one of "%s".', \implode('" or "', $results))); + } + $result = \array_search($value, $choices); + if (!$isAssoc) { + if (\false !== $result) { + $result = $choices[$result]; + } elseif (isset($choices[$value])) { + $result = $choices[$value]; + } + } elseif (\false === $result && isset($choices[$value])) { + $result = $value; + } + if (\false === $result) { + throw new InvalidArgumentException(\sprintf($errorMessage, $value)); + } + // For associative choices, consistently return the key as string: + $multiselectChoices[] = $isAssoc ? (string) $result : $result; + } + if ($multiselect) { + return $multiselectChoices; + } + return \current($multiselectChoices); + }; + } +} diff --git a/vendor/symfony/console/Question/ConfirmationQuestion.php b/vendor/symfony/console/Question/ConfirmationQuestion.php new file mode 100644 index 00000000..df71fd77 --- /dev/null +++ b/vendor/symfony/console/Question/ConfirmationQuestion.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Question; + +/** + * Represents a yes/no question. + * + * @author Fabien Potencier + */ +class ConfirmationQuestion extends Question +{ + /** + * @var string + */ + private $trueAnswerRegex; + /** + * @param string $question The question to ask to the user + * @param bool $default The default answer to return, true or false + * @param string $trueAnswerRegex A regex to match the "yes" answer + */ + public function __construct(string $question, bool $default = \true, string $trueAnswerRegex = '/^y/i') + { + parent::__construct($question, $default); + $this->trueAnswerRegex = $trueAnswerRegex; + $this->setNormalizer($this->getDefaultNormalizer()); + } + /** + * Returns the default answer normalizer. + */ + private function getDefaultNormalizer() : callable + { + $default = $this->getDefault(); + $regex = $this->trueAnswerRegex; + return function ($answer) use($default, $regex) { + if (\is_bool($answer)) { + return $answer; + } + $answerIsTrue = (bool) \preg_match($regex, $answer); + if (\false === $default) { + return $answer && $answerIsTrue; + } + return '' === $answer || $answerIsTrue; + }; + } +} diff --git a/vendor/symfony/console/Question/Question.php b/vendor/symfony/console/Question/Question.php new file mode 100644 index 00000000..f2eea4e8 --- /dev/null +++ b/vendor/symfony/console/Question/Question.php @@ -0,0 +1,285 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Question; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\LogicException; +/** + * Represents a Question. + * + * @author Fabien Potencier + */ +class Question +{ + /** + * @var string + */ + private $question; + /** + * @var int|null + */ + private $attempts; + /** + * @var bool + */ + private $hidden = \false; + /** + * @var bool + */ + private $hiddenFallback = \true; + /** + * @var \Closure|null + */ + private $autocompleterCallback; + /** + * @var \Closure|null + */ + private $validator; + /** + * @var string|int|bool|null|float + */ + private $default; + /** + * @var \Closure|null + */ + private $normalizer; + /** + * @var bool + */ + private $trimmable = \true; + /** + * @var bool + */ + private $multiline = \false; + /** + * @param string $question The question to ask to the user + * @param string|bool|int|float|null $default The default answer to return if the user enters nothing + */ + public function __construct(string $question, $default = null) + { + $this->question = $question; + $this->default = $default; + } + /** + * Returns the question. + */ + public function getQuestion() : string + { + return $this->question; + } + /** + * Returns the default answer. + * @return string|bool|int|float|null + */ + public function getDefault() + { + return $this->default; + } + /** + * Returns whether the user response accepts newline characters. + */ + public function isMultiline() : bool + { + return $this->multiline; + } + /** + * Sets whether the user response should accept newline characters. + * + * @return $this + */ + public function setMultiline(bool $multiline) + { + $this->multiline = $multiline; + return $this; + } + /** + * Returns whether the user response must be hidden. + */ + public function isHidden() : bool + { + return $this->hidden; + } + /** + * Sets whether the user response must be hidden or not. + * + * @return $this + * + * @throws LogicException In case the autocompleter is also used + */ + public function setHidden(bool $hidden) + { + if ($this->autocompleterCallback) { + throw new LogicException('A hidden question cannot use the autocompleter.'); + } + $this->hidden = $hidden; + return $this; + } + /** + * In case the response cannot be hidden, whether to fallback on non-hidden question or not. + */ + public function isHiddenFallback() : bool + { + return $this->hiddenFallback; + } + /** + * Sets whether to fallback on non-hidden question if the response cannot be hidden. + * + * @return $this + */ + public function setHiddenFallback(bool $fallback) + { + $this->hiddenFallback = $fallback; + return $this; + } + /** + * Gets values for the autocompleter. + */ + public function getAutocompleterValues() : ?iterable + { + $callback = $this->getAutocompleterCallback(); + return $callback ? $callback('') : null; + } + /** + * Sets values for the autocompleter. + * + * @return $this + * + * @throws LogicException + */ + public function setAutocompleterValues(?iterable $values) + { + if (\is_array($values)) { + $values = $this->isAssoc($values) ? \array_merge(\array_keys($values), \array_values($values)) : \array_values($values); + $callback = static function () use($values) { + return $values; + }; + } elseif ($values instanceof \Traversable) { + $callback = static function () use($values) { + static $valueCache; + return $valueCache = $valueCache ?? \iterator_to_array($values, \false); + }; + } else { + $callback = null; + } + return $this->setAutocompleterCallback($callback); + } + /** + * Gets the callback function used for the autocompleter. + */ + public function getAutocompleterCallback() : ?callable + { + return $this->autocompleterCallback; + } + /** + * Sets the callback function used for the autocompleter. + * + * The callback is passed the user input as argument and should return an iterable of corresponding suggestions. + * + * @return $this + */ + public function setAutocompleterCallback(?callable $callback = null) + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + if ($this->hidden && null !== $callback) { + throw new LogicException('A hidden question cannot use the autocompleter.'); + } + $this->autocompleterCallback = null === $callback ? null : \Closure::fromCallable($callback); + return $this; + } + /** + * Sets a validator for the question. + * + * @return $this + */ + public function setValidator(?callable $validator = null) + { + if (1 > \func_num_args()) { + trigger_deprecation('symfony/console', '6.2', 'Calling "%s()" without any arguments is deprecated, pass null explicitly instead.', __METHOD__); + } + $this->validator = null === $validator ? null : \Closure::fromCallable($validator); + return $this; + } + /** + * Gets the validator for the question. + */ + public function getValidator() : ?callable + { + return $this->validator; + } + /** + * Sets the maximum number of attempts. + * + * Null means an unlimited number of attempts. + * + * @return $this + * + * @throws InvalidArgumentException in case the number of attempts is invalid + */ + public function setMaxAttempts(?int $attempts) + { + if (null !== $attempts && $attempts < 1) { + throw new InvalidArgumentException('Maximum number of attempts must be a positive value.'); + } + $this->attempts = $attempts; + return $this; + } + /** + * Gets the maximum number of attempts. + * + * Null means an unlimited number of attempts. + */ + public function getMaxAttempts() : ?int + { + return $this->attempts; + } + /** + * Sets a normalizer for the response. + * + * The normalizer can be a callable (a string), a closure or a class implementing __invoke. + * + * @return $this + */ + public function setNormalizer(callable $normalizer) + { + $this->normalizer = \Closure::fromCallable($normalizer); + return $this; + } + /** + * Gets the normalizer for the response. + * + * The normalizer can ba a callable (a string), a closure or a class implementing __invoke. + */ + public function getNormalizer() : ?callable + { + return $this->normalizer; + } + /** + * @return bool + */ + protected function isAssoc(array $array) + { + return (bool) \count(\array_filter(\array_keys($array), 'is_string')); + } + public function isTrimmable() : bool + { + return $this->trimmable; + } + /** + * @return $this + */ + public function setTrimmable(bool $trimmable) + { + $this->trimmable = $trimmable; + return $this; + } +} diff --git a/vendor/symfony/console/README.md b/vendor/symfony/console/README.md new file mode 100644 index 00000000..e9013182 --- /dev/null +++ b/vendor/symfony/console/README.md @@ -0,0 +1,36 @@ +Console Component +================= + +The Console component eases the creation of beautiful and testable command line +interfaces. + +Sponsor +------- + +The Console component for Symfony 6.4 is [backed][1] by [Les-Tilleuls.coop][2]. + +Les-Tilleuls.coop is a team of 70+ Symfony experts who can help you design, develop and +fix your projects. They provide a wide range of professional services including development, +consulting, coaching, training and audits. They also are highly skilled in JS, Go and DevOps. +They are a worker cooperative! + +Help Symfony by [sponsoring][3] its development! + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/console.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) + +Credits +------- + +`Resources/bin/hiddeninput.exe` is a third party binary provided within this +component. Find sources and license at https://github.com/Seldaek/hidden-input. + +[1]: https://symfony.com/backers +[2]: https://les-tilleuls.coop +[3]: https://symfony.com/sponsor diff --git a/vendor/symfony/console/Resources/bin/hiddeninput.exe b/vendor/symfony/console/Resources/bin/hiddeninput.exe new file mode 100644 index 0000000000000000000000000000000000000000..c8cf65e8d819e6e525121cf6b21f1c2429746038 GIT binary patch literal 9216 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 J0sQ~1{4brj`U(I5 literal 0 HcmV?d00001 diff --git a/vendor/symfony/console/Resources/completion.bash b/vendor/symfony/console/Resources/completion.bash new file mode 100644 index 00000000..0d76eacc --- /dev/null +++ b/vendor/symfony/console/Resources/completion.bash @@ -0,0 +1,94 @@ +# This file is part of the Symfony package. +# +# (c) Fabien Potencier +# +# For the full copyright and license information, please view +# https://symfony.com/doc/current/contributing/code/license.html + +_sf_{{ COMMAND_NAME }}() { + + # Use the default completion for shell redirect operators. + for w in '>' '>>' '&>' '<'; do + if [[ $w = "${COMP_WORDS[COMP_CWORD-1]}" ]]; then + compopt -o filenames + COMPREPLY=($(compgen -f -- "${COMP_WORDS[COMP_CWORD]}")) + return 0 + fi + done + + # Use newline as only separator to allow space in completion values + IFS=$'\n' + local sf_cmd="${COMP_WORDS[0]}" + + # for an alias, get the real script behind it + sf_cmd_type=$(type -t $sf_cmd) + if [[ $sf_cmd_type == "alias" ]]; then + sf_cmd=$(alias $sf_cmd | sed -E "s/alias $sf_cmd='(.*)'/\1/") + elif [[ $sf_cmd_type == "file" ]]; then + sf_cmd=$(type -p $sf_cmd) + fi + + if [[ $sf_cmd_type != "function" && ! -x $sf_cmd ]]; then + return 1 + fi + + local cur prev words cword + _get_comp_words_by_ref -n := cur prev words cword + + local completecmd=("$sf_cmd" "_complete" "--no-interaction" "-sbash" "-c$cword" "-a{{ VERSION }}") + for w in ${words[@]}; do + w=$(printf -- '%b' "$w") + # remove quotes from typed values + quote="${w:0:1}" + if [ "$quote" == \' ]; then + w="${w%\'}" + w="${w#\'}" + elif [ "$quote" == \" ]; then + w="${w%\"}" + w="${w#\"}" + fi + # empty values are ignored + if [ ! -z "$w" ]; then + completecmd+=("-i$w") + fi + done + + local sfcomplete + if sfcomplete=$(${completecmd[@]} 2>&1); then + local quote suggestions + quote=${cur:0:1} + + # Use single quotes by default if suggestions contains backslash (FQCN) + if [ "$quote" == '' ] && [[ "$sfcomplete" =~ \\ ]]; then + quote=\' + fi + + if [ "$quote" == \' ]; then + # single quotes: no additional escaping (does not accept ' in values) + suggestions=$(for s in $sfcomplete; do printf $'%q%q%q\n' "$quote" "$s" "$quote"; done) + elif [ "$quote" == \" ]; then + # double quotes: double escaping for \ $ ` " + suggestions=$(for s in $sfcomplete; do + s=${s//\\/\\\\} + s=${s//\$/\\\$} + s=${s//\`/\\\`} + s=${s//\"/\\\"} + printf $'%q%q%q\n' "$quote" "$s" "$quote"; + done) + else + # no quotes: double escaping + suggestions=$(for s in $sfcomplete; do printf $'%q\n' $(printf '%q' "$s"); done) + fi + COMPREPLY=($(IFS=$'\n' compgen -W "$suggestions" -- $(printf -- "%q" "$cur"))) + __ltrim_colon_completions "$cur" + else + if [[ "$sfcomplete" != *"Command \"_complete\" is not defined."* ]]; then + >&2 echo + >&2 echo $sfcomplete + fi + + return 1 + fi +} + +complete -F _sf_{{ COMMAND_NAME }} {{ COMMAND_NAME }} diff --git a/vendor/symfony/console/Resources/completion.fish b/vendor/symfony/console/Resources/completion.fish new file mode 100644 index 00000000..1c34292a --- /dev/null +++ b/vendor/symfony/console/Resources/completion.fish @@ -0,0 +1,29 @@ +# This file is part of the Symfony package. +# +# (c) Fabien Potencier +# +# For the full copyright and license information, please view +# https://symfony.com/doc/current/contributing/code/license.html + +function _sf_{{ COMMAND_NAME }} + set sf_cmd (commandline -o) + set c (count (commandline -oc)) + + set completecmd "$sf_cmd[1]" "_complete" "--no-interaction" "-sfish" "-a{{ VERSION }}" + + for i in $sf_cmd + if [ $i != "" ] + set completecmd $completecmd "-i$i" + end + end + + set completecmd $completecmd "-c$c" + + set sfcomplete ($completecmd) + + for i in $sfcomplete + echo $i + end +end + +complete -c '{{ COMMAND_NAME }}' -a '(_sf_{{ COMMAND_NAME }})' -f diff --git a/vendor/symfony/console/Resources/completion.zsh b/vendor/symfony/console/Resources/completion.zsh new file mode 100644 index 00000000..ff76fe5f --- /dev/null +++ b/vendor/symfony/console/Resources/completion.zsh @@ -0,0 +1,82 @@ +#compdef {{ COMMAND_NAME }} + +# This file is part of the Symfony package. +# +# (c) Fabien Potencier +# +# For the full copyright and license information, please view +# https://symfony.com/doc/current/contributing/code/license.html + +# +# zsh completions for {{ COMMAND_NAME }} +# +# References: +# - https://github.com/spf13/cobra/blob/master/zsh_completions.go +# - https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/Console/Resources/completion.bash +# +_sf_{{ COMMAND_NAME }}() { + local lastParam flagPrefix requestComp out comp + local -a completions + + # The user could have moved the cursor backwards on the command-line. + # We need to trigger completion from the $CURRENT location, so we need + # to truncate the command-line ($words) up to the $CURRENT location. + # (We cannot use $CURSOR as its value does not work when a command is an alias.) + words=("${=words[1,CURRENT]}") lastParam=${words[-1]} + + # For zsh, when completing a flag with an = (e.g., {{ COMMAND_NAME }} -n=) + # completions must be prefixed with the flag + setopt local_options BASH_REMATCH + if [[ "${lastParam}" =~ '-.*=' ]]; then + # We are dealing with a flag with an = + flagPrefix="-P ${BASH_REMATCH}" + fi + + # Prepare the command to obtain completions + requestComp="${words[0]} ${words[1]} _complete --no-interaction -szsh -a{{ VERSION }} -c$((CURRENT-1))" i="" + for w in ${words[@]}; do + w=$(printf -- '%b' "$w") + # remove quotes from typed values + quote="${w:0:1}" + if [ "$quote" = \' ]; then + w="${w%\'}" + w="${w#\'}" + elif [ "$quote" = \" ]; then + w="${w%\"}" + w="${w#\"}" + fi + # empty values are ignored + if [ ! -z "$w" ]; then + i="${i}-i${w} " + fi + done + + # Ensure at least 1 input + if [ "${i}" = "" ]; then + requestComp="${requestComp} -i\" \"" + else + requestComp="${requestComp} ${i}" + fi + + # Use eval to handle any environment variables and such + out=$(eval ${requestComp} 2>/dev/null) + + while IFS='\n' read -r comp; do + if [ -n "$comp" ]; then + # If requested, completions are returned with a description. + # The description is preceded by a TAB character. + # For zsh's _describe, we need to use a : instead of a TAB. + # We first need to escape any : as part of the completion itself. + comp=${comp//:/\\:} + local tab=$(printf '\t') + comp=${comp//$tab/:} + completions+=${comp} + fi + done < <(printf "%s\n" "${out[@]}") + + # Let inbuilt _describe handle completions + eval _describe "completions" completions $flagPrefix + return $? +} + +compdef _sf_{{ COMMAND_NAME }} {{ COMMAND_NAME }} diff --git a/vendor/symfony/console/SignalRegistry/SignalMap.php b/vendor/symfony/console/SignalRegistry/SignalMap.php new file mode 100644 index 00000000..90b2ba72 --- /dev/null +++ b/vendor/symfony/console/SignalRegistry/SignalMap.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\SignalRegistry; + +/** + * @author Grégoire Pineau + */ +class SignalMap +{ + /** + * @var mixed[] + */ + private static $map; + public static function getSignalName(int $signal) : ?string + { + if (!\extension_loaded('pcntl')) { + return null; + } + if (!isset(self::$map)) { + $r = new \ReflectionExtension('pcntl'); + $c = $r->getConstants(); + $map = \array_filter($c, function ($k) { + return \strncmp($k, 'SIG', \strlen('SIG')) === 0 && \strncmp($k, 'SIG_', \strlen('SIG_')) !== 0; + }, \ARRAY_FILTER_USE_KEY); + self::$map = \array_flip($map); + } + return self::$map[$signal] ?? null; + } +} diff --git a/vendor/symfony/console/SignalRegistry/SignalRegistry.php b/vendor/symfony/console/SignalRegistry/SignalRegistry.php new file mode 100644 index 00000000..cf3355d8 --- /dev/null +++ b/vendor/symfony/console/SignalRegistry/SignalRegistry.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\SignalRegistry; + +final class SignalRegistry +{ + /** + * @var mixed[] + */ + private $signalHandlers = []; + public function __construct() + { + if (\function_exists('pcntl_async_signals')) { + \pcntl_async_signals(\true); + } + } + public function register(int $signal, callable $signalHandler) : void + { + if (!isset($this->signalHandlers[$signal])) { + $previousCallback = \pcntl_signal_get_handler($signal); + if (\is_callable($previousCallback)) { + $this->signalHandlers[$signal][] = $previousCallback; + } + } + $this->signalHandlers[$signal][] = $signalHandler; + \pcntl_signal($signal, \Closure::fromCallable([$this, 'handle'])); + } + public static function isSupported() : bool + { + return \function_exists('pcntl_signal'); + } + /** + * @internal + */ + public function handle(int $signal) : void + { + $count = \count($this->signalHandlers[$signal]); + foreach ($this->signalHandlers[$signal] as $i => $signalHandler) { + $hasNext = $i !== $count - 1; + $signalHandler($signal, $hasNext); + } + } +} diff --git a/vendor/symfony/console/SingleCommandApplication.php b/vendor/symfony/console/SingleCommandApplication.php new file mode 100644 index 00000000..4ccb6a9a --- /dev/null +++ b/vendor/symfony/console/SingleCommandApplication.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * @author Grégoire Pineau + */ +class SingleCommandApplication extends Command +{ + /** + * @var string + */ + private $version = 'UNKNOWN'; + /** + * @var bool + */ + private $autoExit = \true; + /** + * @var bool + */ + private $running = \false; + /** + * @return $this + */ + public function setVersion(string $version) + { + $this->version = $version; + return $this; + } + /** + * @final + * + * @return $this + */ + public function setAutoExit(bool $autoExit) + { + $this->autoExit = $autoExit; + return $this; + } + public function run(?InputInterface $input = null, ?OutputInterface $output = null) : int + { + if ($this->running) { + return parent::run($input, $output); + } + // We use the command name as the application name + $application = new Application($this->getName() ?: 'UNKNOWN', $this->version); + $application->setAutoExit($this->autoExit); + // Fix the usage of the command displayed with "--help" + $this->setName($_SERVER['argv'][0]); + $application->add($this); + $application->setDefaultCommand($this->getName(), \true); + $this->running = \true; + try { + $ret = $application->run($input, $output); + } finally { + $this->running = \false; + } + return $ret ?? 1; + } +} diff --git a/vendor/symfony/console/Style/OutputStyle.php b/vendor/symfony/console/Style/OutputStyle.php new file mode 100644 index 00000000..d4aed81a --- /dev/null +++ b/vendor/symfony/console/Style/OutputStyle.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Style; + +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatterInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\ProgressBar; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +/** + * Decorates output to add console style guide helpers. + * + * @author Kevin Bond + */ +abstract class OutputStyle implements OutputInterface, StyleInterface +{ + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $output; + public function __construct(OutputInterface $output) + { + $this->output = $output; + } + /** + * @return void + */ + public function newLine(int $count = 1) + { + $this->output->write(\str_repeat(\PHP_EOL, $count)); + } + public function createProgressBar(int $max = 0) : ProgressBar + { + return new ProgressBar($this->output, $max); + } + /** + * @return void + * @param string|iterable $messages + */ + public function write($messages, bool $newline = \false, int $type = self::OUTPUT_NORMAL) + { + $this->output->write($messages, $newline, $type); + } + /** + * @return void + * @param string|iterable $messages + */ + public function writeln($messages, int $type = self::OUTPUT_NORMAL) + { + $this->output->writeln($messages, $type); + } + /** + * @return void + */ + public function setVerbosity(int $level) + { + $this->output->setVerbosity($level); + } + public function getVerbosity() : int + { + return $this->output->getVerbosity(); + } + /** + * @return void + */ + public function setDecorated(bool $decorated) + { + $this->output->setDecorated($decorated); + } + public function isDecorated() : bool + { + return $this->output->isDecorated(); + } + /** + * @return void + */ + public function setFormatter(OutputFormatterInterface $formatter) + { + $this->output->setFormatter($formatter); + } + public function getFormatter() : OutputFormatterInterface + { + return $this->output->getFormatter(); + } + public function isQuiet() : bool + { + return $this->output->isQuiet(); + } + public function isVerbose() : bool + { + return $this->output->isVerbose(); + } + public function isVeryVerbose() : bool + { + return $this->output->isVeryVerbose(); + } + public function isDebug() : bool + { + return $this->output->isDebug(); + } + /** + * @return OutputInterface + */ + protected function getErrorOutput() + { + if (!$this->output instanceof ConsoleOutputInterface) { + return $this->output; + } + return $this->output->getErrorOutput(); + } +} diff --git a/vendor/symfony/console/Style/StyleInterface.php b/vendor/symfony/console/Style/StyleInterface.php new file mode 100644 index 00000000..33302c09 --- /dev/null +++ b/vendor/symfony/console/Style/StyleInterface.php @@ -0,0 +1,130 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Style; + +/** + * Output style helpers. + * + * @author Kevin Bond + */ +interface StyleInterface +{ + /** + * Formats a command title. + * + * @return void + */ + public function title(string $message); + /** + * Formats a section title. + * + * @return void + */ + public function section(string $message); + /** + * Formats a list. + * + * @return void + */ + public function listing(array $elements); + /** + * Formats informational text. + * + * @return void + * @param string|mixed[] $message + */ + public function text($message); + /** + * Formats a success result bar. + * + * @return void + * @param string|mixed[] $message + */ + public function success($message); + /** + * Formats an error result bar. + * + * @return void + * @param string|mixed[] $message + */ + public function error($message); + /** + * Formats an warning result bar. + * + * @return void + * @param string|mixed[] $message + */ + public function warning($message); + /** + * Formats a note admonition. + * + * @return void + * @param string|mixed[] $message + */ + public function note($message); + /** + * Formats a caution admonition. + * + * @return void + * @param string|mixed[] $message + */ + public function caution($message); + /** + * Formats a table. + * + * @return void + */ + public function table(array $headers, array $rows); + /** + * Asks a question. + * @return mixed + */ + public function ask(string $question, ?string $default = null, ?callable $validator = null); + /** + * Asks a question with the user input hidden. + * @return mixed + */ + public function askHidden(string $question, ?callable $validator = null); + /** + * Asks for confirmation. + */ + public function confirm(string $question, bool $default = \true) : bool; + /** + * Asks a choice question. + * @param mixed $default + * @return mixed + */ + public function choice(string $question, array $choices, $default = null); + /** + * Add newline(s). + * + * @return void + */ + public function newLine(int $count = 1); + /** + * Starts the progress output. + * + * @return void + */ + public function progressStart(int $max = 0); + /** + * Advances the progress output X steps. + * + * @return void + */ + public function progressAdvance(int $step = 1); + /** + * Finishes the progress output. + * + * @return void + */ + public function progressFinish(); +} diff --git a/vendor/symfony/console/Style/SymfonyStyle.php b/vendor/symfony/console/Style/SymfonyStyle.php new file mode 100644 index 00000000..e7e0cd28 --- /dev/null +++ b/vendor/symfony/console/Style/SymfonyStyle.php @@ -0,0 +1,470 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Style; + +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RuntimeException; +use RuleDocGenerator202403\Symfony\Component\Console\Formatter\OutputFormatter; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\Helper; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\OutputWrapper; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\ProgressBar; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\SymfonyQuestionHelper; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\Table; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\TableCell; +use RuleDocGenerator202403\Symfony\Component\Console\Helper\TableSeparator; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleSectionOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\TrimmedBufferOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Question\ChoiceQuestion; +use RuleDocGenerator202403\Symfony\Component\Console\Question\ConfirmationQuestion; +use RuleDocGenerator202403\Symfony\Component\Console\Question\Question; +use RuleDocGenerator202403\Symfony\Component\Console\Terminal; +/** + * Output decorator helpers for the Symfony Style Guide. + * + * @author Kevin Bond + */ +class SymfonyStyle extends OutputStyle +{ + public const MAX_LINE_LENGTH = 120; + /** + * @var \Symfony\Component\Console\Input\InputInterface + */ + private $input; + /** + * @var \Symfony\Component\Console\Output\OutputInterface + */ + private $output; + /** + * @var \Symfony\Component\Console\Helper\SymfonyQuestionHelper + */ + private $questionHelper; + /** + * @var \Symfony\Component\Console\Helper\ProgressBar + */ + private $progressBar; + /** + * @var int + */ + private $lineLength; + /** + * @var \Symfony\Component\Console\Output\TrimmedBufferOutput + */ + private $bufferedOutput; + public function __construct(InputInterface $input, OutputInterface $output) + { + $this->input = $input; + $this->bufferedOutput = new TrimmedBufferOutput(\DIRECTORY_SEPARATOR === '\\' ? 4 : 2, $output->getVerbosity(), \false, clone $output->getFormatter()); + // Windows cmd wraps lines as soon as the terminal width is reached, whether there are following chars or not. + $width = (new Terminal())->getWidth() ?: self::MAX_LINE_LENGTH; + $this->lineLength = \min($width - (int) (\DIRECTORY_SEPARATOR === '\\'), self::MAX_LINE_LENGTH); + parent::__construct($this->output = $output); + } + /** + * Formats a message as a block of text. + * + * @return void + * @param string|mixed[] $messages + */ + public function block($messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = \false, bool $escape = \true) + { + $messages = \is_array($messages) ? \array_values($messages) : [$messages]; + $this->autoPrependBlock(); + $this->writeln($this->createBlock($messages, $type, $style, $prefix, $padding, $escape)); + $this->newLine(); + } + /** + * @return void + */ + public function title(string $message) + { + $this->autoPrependBlock(); + $this->writeln([\sprintf('%s', OutputFormatter::escapeTrailingBackslash($message)), \sprintf('%s', \str_repeat('=', Helper::width(Helper::removeDecoration($this->getFormatter(), $message))))]); + $this->newLine(); + } + /** + * @return void + */ + public function section(string $message) + { + $this->autoPrependBlock(); + $this->writeln([\sprintf('%s', OutputFormatter::escapeTrailingBackslash($message)), \sprintf('%s', \str_repeat('-', Helper::width(Helper::removeDecoration($this->getFormatter(), $message))))]); + $this->newLine(); + } + /** + * @return void + */ + public function listing(array $elements) + { + $this->autoPrependText(); + $elements = \array_map(function ($element) { + return \sprintf(' * %s', $element); + }, $elements); + $this->writeln($elements); + $this->newLine(); + } + /** + * @return void + * @param string|mixed[] $message + */ + public function text($message) + { + $this->autoPrependText(); + $messages = \is_array($message) ? \array_values($message) : [$message]; + foreach ($messages as $message) { + $this->writeln(\sprintf(' %s', $message)); + } + } + /** + * Formats a command comment. + * + * @return void + * @param string|mixed[] $message + */ + public function comment($message) + { + $this->block($message, null, null, ' // ', \false, \false); + } + /** + * @return void + * @param string|mixed[] $message + */ + public function success($message) + { + $this->block($message, 'OK', 'fg=black;bg=green', ' ', \true); + } + /** + * @return void + * @param string|mixed[] $message + */ + public function error($message) + { + $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', \true); + } + /** + * @return void + * @param string|mixed[] $message + */ + public function warning($message) + { + $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', \true); + } + /** + * @return void + * @param string|mixed[] $message + */ + public function note($message) + { + $this->block($message, 'NOTE', 'fg=yellow', ' ! '); + } + /** + * Formats an info message. + * + * @return void + * @param string|mixed[] $message + */ + public function info($message) + { + $this->block($message, 'INFO', 'fg=green', ' ', \true); + } + /** + * @return void + * @param string|mixed[] $message + */ + public function caution($message) + { + $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', \true); + } + /** + * @return void + */ + public function table(array $headers, array $rows) + { + $this->createTable()->setHeaders($headers)->setRows($rows)->render(); + $this->newLine(); + } + /** + * Formats a horizontal table. + * + * @return void + */ + public function horizontalTable(array $headers, array $rows) + { + $this->createTable()->setHorizontal(\true)->setHeaders($headers)->setRows($rows)->render(); + $this->newLine(); + } + /** + * Formats a list of key/value horizontally. + * + * Each row can be one of: + * * 'A title' + * * ['key' => 'value'] + * * new TableSeparator() + * + * @return void + * @param string|mixed[]|\Symfony\Component\Console\Helper\TableSeparator ...$list + */ + public function definitionList(...$list) + { + $headers = []; + $row = []; + foreach ($list as $value) { + if ($value instanceof TableSeparator) { + $headers[] = $value; + $row[] = $value; + continue; + } + if (\is_string($value)) { + $headers[] = new TableCell($value, ['colspan' => 2]); + $row[] = null; + continue; + } + if (!\is_array($value)) { + throw new InvalidArgumentException('Value should be an array, string, or an instance of TableSeparator.'); + } + $headers[] = \key($value); + $row[] = \current($value); + } + $this->horizontalTable($headers, [$row]); + } + /** + * @return mixed + */ + public function ask(string $question, ?string $default = null, ?callable $validator = null) + { + $question = new Question($question, $default); + $question->setValidator($validator); + return $this->askQuestion($question); + } + /** + * @return mixed + */ + public function askHidden(string $question, ?callable $validator = null) + { + $question = new Question($question); + $question->setHidden(\true); + $question->setValidator($validator); + return $this->askQuestion($question); + } + public function confirm(string $question, bool $default = \true) : bool + { + return $this->askQuestion(new ConfirmationQuestion($question, $default)); + } + /** + * @param mixed $default + * @return mixed + */ + public function choice(string $question, array $choices, $default = null, bool $multiSelect = \false) + { + if (null !== $default) { + $values = \array_flip($choices); + $default = $values[$default] ?? $default; + } + $questionChoice = new ChoiceQuestion($question, $choices, $default); + $questionChoice->setMultiselect($multiSelect); + return $this->askQuestion($questionChoice); + } + /** + * @return void + */ + public function progressStart(int $max = 0) + { + $this->progressBar = $this->createProgressBar($max); + $this->progressBar->start(); + } + /** + * @return void + */ + public function progressAdvance(int $step = 1) + { + $this->getProgressBar()->advance($step); + } + /** + * @return void + */ + public function progressFinish() + { + $this->getProgressBar()->finish(); + $this->newLine(2); + unset($this->progressBar); + } + public function createProgressBar(int $max = 0) : ProgressBar + { + $progressBar = parent::createProgressBar($max); + if ('\\' !== \DIRECTORY_SEPARATOR || 'Hyper' === \getenv('TERM_PROGRAM')) { + $progressBar->setEmptyBarCharacter('░'); + // light shade character \u2591 + $progressBar->setProgressCharacter(''); + $progressBar->setBarCharacter('▓'); + // dark shade character \u2593 + } + return $progressBar; + } + /** + * @see ProgressBar::iterate() + * + * @template TKey + * @template TValue + * + * @param iterable $iterable + * @param int|null $max Number of steps to complete the bar (0 if indeterminate), if null it will be inferred from $iterable + * + * @return iterable + */ + public function progressIterate(iterable $iterable, ?int $max = null) : iterable + { + yield from $this->createProgressBar()->iterate($iterable, $max); + $this->newLine(2); + } + /** + * @return mixed + */ + public function askQuestion(Question $question) + { + if ($this->input->isInteractive()) { + $this->autoPrependBlock(); + } + $this->questionHelper = $this->questionHelper ?? new SymfonyQuestionHelper(); + $answer = $this->questionHelper->ask($this->input, $this, $question); + if ($this->input->isInteractive()) { + if ($this->output instanceof ConsoleSectionOutput) { + // add the new line of the `return` to submit the input to ConsoleSectionOutput, because ConsoleSectionOutput is holding all it's lines. + // this is relevant when a `ConsoleSectionOutput::clear` is called. + $this->output->addNewLineOfInputSubmit(); + } + $this->newLine(); + $this->bufferedOutput->write("\n"); + } + return $answer; + } + /** + * @return void + * @param string|iterable $messages + */ + public function writeln($messages, int $type = self::OUTPUT_NORMAL) + { + if (!\is_iterable($messages)) { + $messages = [$messages]; + } + foreach ($messages as $message) { + parent::writeln($message, $type); + $this->writeBuffer($message, \true, $type); + } + } + /** + * @return void + * @param string|iterable $messages + */ + public function write($messages, bool $newline = \false, int $type = self::OUTPUT_NORMAL) + { + if (!\is_iterable($messages)) { + $messages = [$messages]; + } + foreach ($messages as $message) { + parent::write($message, $newline, $type); + $this->writeBuffer($message, $newline, $type); + } + } + /** + * @return void + */ + public function newLine(int $count = 1) + { + parent::newLine($count); + $this->bufferedOutput->write(\str_repeat("\n", $count)); + } + /** + * Returns a new instance which makes use of stderr if available. + */ + public function getErrorStyle() : self + { + return new self($this->input, $this->getErrorOutput()); + } + public function createTable() : Table + { + $output = $this->output instanceof ConsoleOutputInterface ? $this->output->section() : $this->output; + $style = clone Table::getStyleDefinition('symfony-style-guide'); + $style->setCellHeaderFormat('%s'); + return (new Table($output))->setStyle($style); + } + private function getProgressBar() : ProgressBar + { + if (!isset($this->progressBar)) { + throw new RuntimeException('The ProgressBar is not started.'); + } + return $this->progressBar; + } + private function autoPrependBlock() : void + { + $chars = \substr(\str_replace(\PHP_EOL, "\n", $this->bufferedOutput->fetch()), -2); + if (!isset($chars[0])) { + $this->newLine(); + // empty history, so we should start with a new line. + return; + } + // Prepend new line for each non LF chars (This means no blank line was output before) + $this->newLine(2 - \substr_count($chars, "\n")); + } + private function autoPrependText() : void + { + $fetched = $this->bufferedOutput->fetch(); + // Prepend new line if last char isn't EOL: + if ($fetched && \substr_compare($fetched, "\n", -\strlen("\n")) !== 0) { + $this->newLine(); + } + } + private function writeBuffer(string $message, bool $newLine, int $type) : void + { + // We need to know if the last chars are PHP_EOL + $this->bufferedOutput->write($message, $newLine, $type); + } + private function createBlock(iterable $messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = \false, bool $escape = \false) : array + { + $indentLength = 0; + $prefixLength = Helper::width(Helper::removeDecoration($this->getFormatter(), $prefix)); + $lines = []; + if (null !== $type) { + $type = \sprintf('[%s] ', $type); + $indentLength = Helper::width($type); + $lineIndentation = \str_repeat(' ', $indentLength); + } + // wrap and add newlines for each element + $outputWrapper = new OutputWrapper(); + foreach ($messages as $key => $message) { + if ($escape) { + $message = OutputFormatter::escape($message); + } + $lines = \array_merge($lines, \explode(\PHP_EOL, $outputWrapper->wrap($message, $this->lineLength - $prefixLength - $indentLength, \PHP_EOL))); + if (\count($messages) > 1 && $key < \count($messages) - 1) { + $lines[] = ''; + } + } + $firstLineIndex = 0; + if ($padding && $this->isDecorated()) { + $firstLineIndex = 1; + \array_unshift($lines, ''); + $lines[] = ''; + } + foreach ($lines as $i => &$line) { + if (null !== $type) { + $line = $firstLineIndex === $i ? $type . $line : $lineIndentation . $line; + } + $line = $prefix . $line; + $line .= \str_repeat(' ', \max($this->lineLength - Helper::width(Helper::removeDecoration($this->getFormatter(), $line)), 0)); + if ($style) { + $line = \sprintf('<%s>%s', $style, $line); + } + } + return $lines; + } +} diff --git a/vendor/symfony/console/Terminal.php b/vendor/symfony/console/Terminal.php new file mode 100644 index 00000000..c59a641f --- /dev/null +++ b/vendor/symfony/console/Terminal.php @@ -0,0 +1,209 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console; + +use RuleDocGenerator202403\Symfony\Component\Console\Output\AnsiColorMode; +class Terminal +{ + public const DEFAULT_COLOR_MODE = AnsiColorMode::Ansi4; + /** + * @var \Symfony\Component\Console\Output\AnsiColorMode|null + */ + private static $colorMode; + /** + * @var int|null + */ + private static $width; + /** + * @var int|null + */ + private static $height; + /** + * @var bool|null + */ + private static $stty; + /** + * About Ansi color types: https://en.wikipedia.org/wiki/ANSI_escape_code#Colors + * For more information about true color support with terminals https://github.com/termstandard/colors/. + */ + public static function getColorMode() : AnsiColorMode + { + // Use Cache from previous run (or user forced mode) + if (null !== self::$colorMode) { + return self::$colorMode; + } + // Try with $COLORTERM first + if (\is_string($colorterm = \getenv('COLORTERM'))) { + $colorterm = \strtolower($colorterm); + if (\strpos($colorterm, 'truecolor') !== \false) { + self::setColorMode(AnsiColorMode::Ansi24); + return self::$colorMode; + } + if (\strpos($colorterm, '256color') !== \false) { + self::setColorMode(AnsiColorMode::Ansi8); + return self::$colorMode; + } + } + // Try with $TERM + if (\is_string($term = \getenv('TERM'))) { + $term = \strtolower($term); + if (\strpos($term, 'truecolor') !== \false) { + self::setColorMode(AnsiColorMode::Ansi24); + return self::$colorMode; + } + if (\strpos($term, '256color') !== \false) { + self::setColorMode(AnsiColorMode::Ansi8); + return self::$colorMode; + } + } + self::setColorMode(self::DEFAULT_COLOR_MODE); + return self::$colorMode; + } + /** + * Force a terminal color mode rendering. + * @param ?\Symfony\Component\Console\Output\AnsiColorMode::* $colorMode + */ + public static function setColorMode($colorMode) : void + { + self::$colorMode = $colorMode; + } + /** + * Gets the terminal width. + */ + public function getWidth() : int + { + $width = \getenv('COLUMNS'); + if (\false !== $width) { + return (int) \trim($width); + } + if (null === self::$width) { + self::initDimensions(); + } + return self::$width ?: 80; + } + /** + * Gets the terminal height. + */ + public function getHeight() : int + { + $height = \getenv('LINES'); + if (\false !== $height) { + return (int) \trim($height); + } + if (null === self::$height) { + self::initDimensions(); + } + return self::$height ?: 50; + } + /** + * @internal + */ + public static function hasSttyAvailable() : bool + { + if (null !== self::$stty) { + return self::$stty; + } + // skip check if shell_exec function is disabled + if (!\function_exists('shell_exec')) { + return \false; + } + return self::$stty = (bool) \shell_exec('stty 2> ' . ('\\' === \DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null')); + } + private static function initDimensions() : void + { + if ('\\' === \DIRECTORY_SEPARATOR) { + $ansicon = \getenv('ANSICON'); + if (\false !== $ansicon && \preg_match('/^(\\d+)x(\\d+)(?: \\((\\d+)x(\\d+)\\))?$/', \trim($ansicon), $matches)) { + // extract [w, H] from "wxh (WxH)" + // or [w, h] from "wxh" + self::$width = (int) $matches[1]; + self::$height = isset($matches[4]) ? (int) $matches[4] : (int) $matches[2]; + } elseif (!self::hasVt100Support() && self::hasSttyAvailable()) { + // only use stty on Windows if the terminal does not support vt100 (e.g. Windows 7 + git-bash) + // testing for stty in a Windows 10 vt100-enabled console will implicitly disable vt100 support on STDOUT + self::initDimensionsUsingStty(); + } elseif (null !== ($dimensions = self::getConsoleMode())) { + // extract [w, h] from "wxh" + self::$width = (int) $dimensions[0]; + self::$height = (int) $dimensions[1]; + } + } else { + self::initDimensionsUsingStty(); + } + } + /** + * Returns whether STDOUT has vt100 support (some Windows 10+ configurations). + */ + private static function hasVt100Support() : bool + { + return \function_exists('sapi_windows_vt100_support') && \sapi_windows_vt100_support(\fopen('php://stdout', 'w')); + } + /** + * Initializes dimensions using the output of an stty columns line. + */ + private static function initDimensionsUsingStty() : void + { + if ($sttyString = self::getSttyColumns()) { + if (\preg_match('/rows.(\\d+);.columns.(\\d+);/is', $sttyString, $matches)) { + // extract [w, h] from "rows h; columns w;" + self::$width = (int) $matches[2]; + self::$height = (int) $matches[1]; + } elseif (\preg_match('/;.(\\d+).rows;.(\\d+).columns/is', $sttyString, $matches)) { + // extract [w, h] from "; h rows; w columns" + self::$width = (int) $matches[2]; + self::$height = (int) $matches[1]; + } + } + } + /** + * Runs and parses mode CON if it's available, suppressing any error output. + * + * @return int[]|null An array composed of the width and the height or null if it could not be parsed + */ + private static function getConsoleMode() : ?array + { + $info = self::readFromProcess('mode CON'); + if (null === $info || !\preg_match('/--------+\\r?\\n.+?(\\d+)\\r?\\n.+?(\\d+)\\r?\\n/', $info, $matches)) { + return null; + } + return [(int) $matches[2], (int) $matches[1]]; + } + /** + * Runs and parses stty -a if it's available, suppressing any error output. + */ + private static function getSttyColumns() : ?string + { + return self::readFromProcess(['stty', '-a']); + } + /** + * @param string|mixed[] $command + */ + private static function readFromProcess($command) : ?string + { + if (!\function_exists('proc_open')) { + return null; + } + $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']]; + $cp = \function_exists('sapi_windows_cp_set') ? \sapi_windows_cp_get() : 0; + $process = \proc_open(\is_array($command) ? \implode(' ', \array_map('escapeshellarg', $command)) : $command, $descriptorspec, $pipes, null, null, ['suppress_errors' => \true]); + if (!\is_resource($process)) { + return null; + } + $info = \stream_get_contents($pipes[1]); + \fclose($pipes[1]); + \fclose($pipes[2]); + \proc_close($process); + if ($cp) { + \sapi_windows_cp_set($cp); + } + return $info; + } +} diff --git a/vendor/symfony/console/Tester/ApplicationTester.php b/vendor/symfony/console/Tester/ApplicationTester.php new file mode 100644 index 00000000..87234b1a --- /dev/null +++ b/vendor/symfony/console/Tester/ApplicationTester.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Tester; + +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Console\Input\ArrayInput; +/** + * Eases the testing of console applications. + * + * When testing an application, don't forget to disable the auto exit flag: + * + * $application = new Application(); + * $application->setAutoExit(false); + * + * @author Fabien Potencier + */ +class ApplicationTester +{ + use TesterTrait; + /** + * @var \Symfony\Component\Console\Application + */ + private $application; + public function __construct(Application $application) + { + $this->application = $application; + } + /** + * Executes the application. + * + * Available options: + * + * * interactive: Sets the input interactive flag + * * decorated: Sets the output decorated flag + * * verbosity: Sets the output verbosity flag + * * capture_stderr_separately: Make output of stdOut and stdErr separately available + * + * @return int The command exit code + */ + public function run(array $input, array $options = []) : int + { + $prevShellVerbosity = \getenv('SHELL_VERBOSITY'); + try { + $this->input = new ArrayInput($input); + if (isset($options['interactive'])) { + $this->input->setInteractive($options['interactive']); + } + if ($this->inputs) { + $this->input->setStream(self::createStream($this->inputs)); + } + $this->initOutput($options); + return $this->statusCode = $this->application->run($this->input, $this->output); + } finally { + // SHELL_VERBOSITY is set by Application::configureIO so we need to unset/reset it + // to its previous value to avoid one test's verbosity to spread to the following tests + if (\false === $prevShellVerbosity) { + if (\function_exists('putenv')) { + @\putenv('SHELL_VERBOSITY'); + } + unset($_ENV['SHELL_VERBOSITY']); + unset($_SERVER['SHELL_VERBOSITY']); + } else { + if (\function_exists('putenv')) { + @\putenv('SHELL_VERBOSITY=' . $prevShellVerbosity); + } + $_ENV['SHELL_VERBOSITY'] = $prevShellVerbosity; + $_SERVER['SHELL_VERBOSITY'] = $prevShellVerbosity; + } + } + } +} diff --git a/vendor/symfony/console/Tester/CommandCompletionTester.php b/vendor/symfony/console/Tester/CommandCompletionTester.php new file mode 100644 index 00000000..f22d0f23 --- /dev/null +++ b/vendor/symfony/console/Tester/CommandCompletionTester.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Tester; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionInput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +/** + * Eases the testing of command completion. + * + * @author Jérôme Tamarelle + */ +class CommandCompletionTester +{ + /** + * @var \Symfony\Component\Console\Command\Command + */ + private $command; + public function __construct(Command $command) + { + $this->command = $command; + } + /** + * Create completion suggestions from input tokens. + */ + public function complete(array $input) : array + { + $currentIndex = \count($input); + if ('' === \end($input)) { + \array_pop($input); + } + \array_unshift($input, $this->command->getName()); + $completionInput = CompletionInput::fromTokens($input, $currentIndex); + $completionInput->bind($this->command->getDefinition()); + $suggestions = new CompletionSuggestions(); + $this->command->complete($completionInput, $suggestions); + $options = []; + foreach ($suggestions->getOptionSuggestions() as $option) { + $options[] = '--' . $option->getName(); + } + return \array_map('strval', \array_merge($options, $suggestions->getValueSuggestions())); + } +} diff --git a/vendor/symfony/console/Tester/CommandTester.php b/vendor/symfony/console/Tester/CommandTester.php new file mode 100644 index 00000000..417bf21a --- /dev/null +++ b/vendor/symfony/console/Tester/CommandTester.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Tester; + +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Input\ArrayInput; +/** + * Eases the testing of console commands. + * + * @author Fabien Potencier + * @author Robin Chalas + */ +class CommandTester +{ + use TesterTrait; + /** + * @var \Symfony\Component\Console\Command\Command + */ + private $command; + public function __construct(Command $command) + { + $this->command = $command; + } + /** + * Executes the command. + * + * Available execution options: + * + * * interactive: Sets the input interactive flag + * * decorated: Sets the output decorated flag + * * verbosity: Sets the output verbosity flag + * * capture_stderr_separately: Make output of stdOut and stdErr separately available + * + * @param array $input An array of command arguments and options + * @param array $options An array of execution options + * + * @return int The command exit code + */ + public function execute(array $input, array $options = []) : int + { + // set the command name automatically if the application requires + // this argument and no command name was passed + if (!isset($input['command']) && null !== ($application = $this->command->getApplication()) && $application->getDefinition()->hasArgument('command')) { + $input = \array_merge(['command' => $this->command->getName()], $input); + } + $this->input = new ArrayInput($input); + // Use an in-memory input stream even if no inputs are set so that QuestionHelper::ask() does not rely on the blocking STDIN. + $this->input->setStream(self::createStream($this->inputs)); + if (isset($options['interactive'])) { + $this->input->setInteractive($options['interactive']); + } + if (!isset($options['decorated'])) { + $options['decorated'] = \false; + } + $this->initOutput($options); + return $this->statusCode = $this->command->run($this->input, $this->output); + } +} diff --git a/vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.php b/vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.php new file mode 100644 index 00000000..483da71d --- /dev/null +++ b/vendor/symfony/console/Tester/Constraint/CommandIsSuccessful.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Tester\Constraint; + +use RuleDocGenerator202403\PHPUnit\Framework\Constraint\Constraint; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +final class CommandIsSuccessful extends Constraint +{ + public function toString() : string + { + return 'is successful'; + } + protected function matches($other) : bool + { + return Command::SUCCESS === $other; + } + protected function failureDescription($other) : string + { + return 'the command ' . $this->toString(); + } + protected function additionalFailureDescription($other) : string + { + $mapping = [Command::FAILURE => 'Command failed.', Command::INVALID => 'Command was invalid.']; + return $mapping[$other] ?? \sprintf('Command returned exit status %d.', $other); + } +} diff --git a/vendor/symfony/console/Tester/TesterTrait.php b/vendor/symfony/console/Tester/TesterTrait.php new file mode 100644 index 00000000..1fb0e263 --- /dev/null +++ b/vendor/symfony/console/Tester/TesterTrait.php @@ -0,0 +1,167 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Console\Tester; + +use RuleDocGenerator202403\PHPUnit\Framework\Assert; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\ConsoleOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Output\StreamOutput; +use RuleDocGenerator202403\Symfony\Component\Console\Tester\Constraint\CommandIsSuccessful; +/** + * @author Amrouche Hamza + */ +trait TesterTrait +{ + /** + * @var \Symfony\Component\Console\Output\StreamOutput + */ + private $output; + /** + * @var mixed[] + */ + private $inputs = []; + /** + * @var bool + */ + private $captureStreamsIndependently = \false; + /** + * @var \Symfony\Component\Console\Input\InputInterface + */ + private $input; + /** + * @var int + */ + private $statusCode; + /** + * Gets the display returned by the last execution of the command or application. + * + * @throws \RuntimeException If it's called before the execute method + */ + public function getDisplay(bool $normalize = \false) : string + { + if (!isset($this->output)) { + throw new \RuntimeException('Output not initialized, did you execute the command before requesting the display?'); + } + \rewind($this->output->getStream()); + $display = \stream_get_contents($this->output->getStream()); + if ($normalize) { + $display = \str_replace(\PHP_EOL, "\n", $display); + } + return $display; + } + /** + * Gets the output written to STDERR by the application. + * + * @param bool $normalize Whether to normalize end of lines to \n or not + */ + public function getErrorOutput(bool $normalize = \false) : string + { + if (!$this->captureStreamsIndependently) { + throw new \LogicException('The error output is not available when the tester is run without "capture_stderr_separately" option set.'); + } + \rewind($this->output->getErrorOutput()->getStream()); + $display = \stream_get_contents($this->output->getErrorOutput()->getStream()); + if ($normalize) { + $display = \str_replace(\PHP_EOL, "\n", $display); + } + return $display; + } + /** + * Gets the input instance used by the last execution of the command or application. + */ + public function getInput() : InputInterface + { + return $this->input; + } + /** + * Gets the output instance used by the last execution of the command or application. + */ + public function getOutput() : OutputInterface + { + return $this->output; + } + /** + * Gets the status code returned by the last execution of the command or application. + * + * @throws \RuntimeException If it's called before the execute method + */ + public function getStatusCode() : int + { + if (!isset($this->statusCode)) { + throw new \RuntimeException('Status code not initialized, did you execute the command before requesting the status code?'); + } + return $this->statusCode; + } + public function assertCommandIsSuccessful(string $message = '') : void + { + Assert::assertThat($this->statusCode, new CommandIsSuccessful(), $message); + } + /** + * Sets the user inputs. + * + * @param array $inputs An array of strings representing each input + * passed to the command input stream + * + * @return $this + */ + public function setInputs(array $inputs) + { + $this->inputs = $inputs; + return $this; + } + /** + * Initializes the output property. + * + * Available options: + * + * * decorated: Sets the output decorated flag + * * verbosity: Sets the output verbosity flag + * * capture_stderr_separately: Make output of stdOut and stdErr separately available + */ + private function initOutput(array $options) : void + { + $this->captureStreamsIndependently = $options['capture_stderr_separately'] ?? \false; + if (!$this->captureStreamsIndependently) { + $this->output = new StreamOutput(\fopen('php://memory', 'w', \false)); + if (isset($options['decorated'])) { + $this->output->setDecorated($options['decorated']); + } + if (isset($options['verbosity'])) { + $this->output->setVerbosity($options['verbosity']); + } + } else { + $this->output = new ConsoleOutput($options['verbosity'] ?? ConsoleOutput::VERBOSITY_NORMAL, $options['decorated'] ?? null); + $errorOutput = new StreamOutput(\fopen('php://memory', 'w', \false)); + $errorOutput->setFormatter($this->output->getFormatter()); + $errorOutput->setVerbosity($this->output->getVerbosity()); + $errorOutput->setDecorated($this->output->isDecorated()); + $reflectedOutput = new \ReflectionObject($this->output); + $strErrProperty = $reflectedOutput->getProperty('stderr'); + $strErrProperty->setValue($this->output, $errorOutput); + $reflectedParent = $reflectedOutput->getParentClass(); + $streamProperty = $reflectedParent->getProperty('stream'); + $streamProperty->setValue($this->output, \fopen('php://memory', 'w', \false)); + } + } + /** + * @return resource + */ + private static function createStream(array $inputs) + { + $stream = \fopen('php://memory', 'r+', \false); + foreach ($inputs as $input) { + \fwrite($stream, $input . \PHP_EOL); + } + \rewind($stream); + return $stream; + } +} diff --git a/vendor/symfony/console/composer.json b/vendor/symfony/console/composer.json new file mode 100644 index 00000000..0b9964e6 --- /dev/null +++ b/vendor/symfony/console/composer.json @@ -0,0 +1,62 @@ +{ + "name": "symfony\/console", + "type": "library", + "description": "Eases the creation of beautiful and testable command line interfaces", + "keywords": [ + "console", + "cli", + "command-line", + "terminal" + ], + "homepage": "https:\/\/symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "require": { + "php": ">=8.1", + "symfony\/deprecation-contracts": "^2.5|^3", + "symfony\/polyfill-mbstring": "~1.0", + "symfony\/service-contracts": "^2.5|^3", + "symfony\/string": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "symfony\/config": "^5.4|^6.0|^7.0", + "symfony\/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony\/dependency-injection": "^5.4|^6.0|^7.0", + "symfony\/http-foundation": "^6.4|^7.0", + "symfony\/http-kernel": "^6.4|^7.0", + "symfony\/lock": "^5.4|^6.0|^7.0", + "symfony\/messenger": "^5.4|^6.0|^7.0", + "symfony\/process": "^5.4|^6.0|^7.0", + "symfony\/stopwatch": "^5.4|^6.0|^7.0", + "symfony\/var-dumper": "^5.4|^6.0|^7.0", + "psr\/log": "^1|^2|^3" + }, + "provide": { + "psr\/log-implementation": "1.0|2.0|3.0" + }, + "conflict": { + "symfony\/dependency-injection": "<5.4", + "symfony\/dotenv": "<5.4", + "symfony\/event-dispatcher": "<5.4", + "symfony\/lock": "<5.4", + "symfony\/process": "<5.4" + }, + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "\/Tests\/" + ] + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/vendor/symfony/deprecation-contracts/CHANGELOG.md b/vendor/symfony/deprecation-contracts/CHANGELOG.md new file mode 100644 index 00000000..7932e261 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +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/LICENSE b/vendor/symfony/deprecation-contracts/LICENSE new file mode 100644 index 00000000..0ed3a246 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020-present Fabien Potencier + +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/symfony/deprecation-contracts/README.md b/vendor/symfony/deprecation-contracts/README.md new file mode 100644 index 00000000..9814864c --- /dev/null +++ b/vendor/symfony/deprecation-contracts/README.md @@ -0,0 +1,26 @@ +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 new file mode 100644 index 00000000..768470a9 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/composer.json @@ -0,0 +1,35 @@ +{ + "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.4-dev" + }, + "thanks": { + "name": "symfony\/contracts", + "url": "https:\/\/github.com\/symfony\/contracts" + } + } +} \ No newline at end of file diff --git a/vendor/symfony/deprecation-contracts/function.php b/vendor/symfony/deprecation-contracts/function.php new file mode 100644 index 00000000..d4371504 --- /dev/null +++ b/vendor/symfony/deprecation-contracts/function.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (!function_exists('trigger_deprecation')) { + /** + * Triggers a silenced deprecation notice. + * + * @param string $package The name of the Composer package that is triggering the deprecation + * @param string $version The version of the package that introduced the deprecation + * @param string $message The message of the deprecation + * @param mixed ...$args Values to insert in the message using printf() formatting + * + * @author Nicolas Grekas + */ + function trigger_deprecation(string $package, string $version, string $message, ...$args): void + { + @trigger_error(($package || $version ? "Since $package $version: " : '').($args ? vsprintf($message, $args) : $message), \E_USER_DEPRECATED); + } +} diff --git a/vendor/symfony/filesystem/CHANGELOG.md b/vendor/symfony/filesystem/CHANGELOG.md new file mode 100644 index 00000000..fcb7170c --- /dev/null +++ b/vendor/symfony/filesystem/CHANGELOG.md @@ -0,0 +1,82 @@ +CHANGELOG +========= + +5.4 +--- + + * Add `Path` class + * Add `$lock` argument to `Filesystem::appendToFile()` + +5.0.0 +----- + + * `Filesystem::dumpFile()` and `appendToFile()` don't accept arrays anymore + +4.4.0 +----- + + * support for passing a `null` value to `Filesystem::isAbsolutePath()` is deprecated and will be removed in 5.0 + * `tempnam()` now accepts a third argument `$suffix`. + +4.3.0 +----- + + * support for passing arrays to `Filesystem::dumpFile()` is deprecated and will be removed in 5.0 + * support for passing arrays to `Filesystem::appendToFile()` is deprecated and will be removed in 5.0 + +4.0.0 +----- + + * removed `LockHandler` + * Support for passing relative paths to `Filesystem::makePathRelative()` has been removed. + +3.4.0 +----- + + * support for passing relative paths to `Filesystem::makePathRelative()` is deprecated and will be removed in 4.0 + +3.3.0 +----- + + * added `appendToFile()` to append contents to existing files + +3.2.0 +----- + + * added `readlink()` as a platform independent method to read links + +3.0.0 +----- + + * removed `$mode` argument from `Filesystem::dumpFile()` + +2.8.0 +----- + + * added tempnam() a stream aware version of PHP's native tempnam() + +2.6.0 +----- + + * added LockHandler + +2.3.12 +------ + + * deprecated dumpFile() file mode argument. + +2.3.0 +----- + + * added the dumpFile() method to atomically write files + +2.2.0 +----- + + * added a delete option for the mirror() method + +2.1.0 +----- + + * 24eb396 : BC Break : mkdir() function now throws exception in case of failure instead of returning Boolean value + * created the component diff --git a/vendor/symfony/filesystem/Exception/ExceptionInterface.php b/vendor/symfony/filesystem/Exception/ExceptionInterface.php new file mode 100644 index 00000000..32a7f8b8 --- /dev/null +++ b/vendor/symfony/filesystem/Exception/ExceptionInterface.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Filesystem\Exception; + +/** + * Exception interface for all exceptions thrown by the component. + * + * @author Romain Neutron + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/filesystem/Exception/FileNotFoundException.php b/vendor/symfony/filesystem/Exception/FileNotFoundException.php new file mode 100644 index 00000000..dbe3adb8 --- /dev/null +++ b/vendor/symfony/filesystem/Exception/FileNotFoundException.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Filesystem\Exception; + +/** + * Exception class thrown when a file couldn't be found. + * + * @author Fabien Potencier + * @author Christian Gärtner + */ +class FileNotFoundException extends IOException +{ + public function __construct(?string $message = null, int $code = 0, ?\Throwable $previous = null, ?string $path = null) + { + if (null === $message) { + if (null === $path) { + $message = 'File could not be found.'; + } else { + $message = \sprintf('File "%s" could not be found.', $path); + } + } + parent::__construct($message, $code, $previous, $path); + } +} diff --git a/vendor/symfony/filesystem/Exception/IOException.php b/vendor/symfony/filesystem/Exception/IOException.php new file mode 100644 index 00000000..dd248b64 --- /dev/null +++ b/vendor/symfony/filesystem/Exception/IOException.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Filesystem\Exception; + +/** + * Exception class thrown when a filesystem operation failure happens. + * + * @author Romain Neutron + * @author Christian Gärtner + * @author Fabien Potencier + */ +class IOException extends \RuntimeException implements IOExceptionInterface +{ + /** + * @var string|null + */ + private $path; + public function __construct(string $message, int $code = 0, ?\Throwable $previous = null, ?string $path = null) + { + $this->path = $path; + parent::__construct($message, $code, $previous); + } + public function getPath() : ?string + { + return $this->path; + } +} diff --git a/vendor/symfony/filesystem/Exception/IOExceptionInterface.php b/vendor/symfony/filesystem/Exception/IOExceptionInterface.php new file mode 100644 index 00000000..ffcb5f28 --- /dev/null +++ b/vendor/symfony/filesystem/Exception/IOExceptionInterface.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Filesystem\Exception; + +/** + * IOException interface for file and input/output stream related exceptions thrown by the component. + * + * @author Christian Gärtner + */ +interface IOExceptionInterface extends ExceptionInterface +{ + /** + * Returns the associated path for the exception. + */ + public function getPath() : ?string; +} diff --git a/vendor/symfony/filesystem/Exception/InvalidArgumentException.php b/vendor/symfony/filesystem/Exception/InvalidArgumentException.php new file mode 100644 index 00000000..9ac38440 --- /dev/null +++ b/vendor/symfony/filesystem/Exception/InvalidArgumentException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Filesystem\Exception; + +/** + * @author Christian Flothmann + */ +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/filesystem/Exception/RuntimeException.php b/vendor/symfony/filesystem/Exception/RuntimeException.php new file mode 100644 index 00000000..715921b0 --- /dev/null +++ b/vendor/symfony/filesystem/Exception/RuntimeException.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Filesystem\Exception; + +/** + * @author Théo Fidry + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/filesystem/Filesystem.php b/vendor/symfony/filesystem/Filesystem.php new file mode 100644 index 00000000..a6c11575 --- /dev/null +++ b/vendor/symfony/filesystem/Filesystem.php @@ -0,0 +1,670 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Filesystem; + +use RuleDocGenerator202403\Symfony\Component\Filesystem\Exception\FileNotFoundException; +use RuleDocGenerator202403\Symfony\Component\Filesystem\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Filesystem\Exception\IOException; +/** + * Provides basic utility to manipulate the file system. + * + * @author Fabien Potencier + */ +class Filesystem +{ + /** + * @var string|null + */ + private static $lastError; + /** + * Copies a file. + * + * If the target file is older than the origin file, it's always overwritten. + * If the target file is newer, it is overwritten only when the + * $overwriteNewerFiles option is set to true. + * + * @return void + * + * @throws FileNotFoundException When originFile doesn't exist + * @throws IOException When copy fails + */ + public function copy(string $originFile, string $targetFile, bool $overwriteNewerFiles = \false) + { + $originIsLocal = \stream_is_local($originFile) || 0 === \stripos($originFile, 'file://'); + if ($originIsLocal && !\is_file($originFile)) { + throw new FileNotFoundException(\sprintf('Failed to copy "%s" because file does not exist.', $originFile), 0, null, $originFile); + } + $this->mkdir(\dirname($targetFile)); + $doCopy = \true; + if (!$overwriteNewerFiles && null === \parse_url($originFile, \PHP_URL_HOST) && \is_file($targetFile)) { + $doCopy = \filemtime($originFile) > \filemtime($targetFile); + } + if ($doCopy) { + // https://bugs.php.net/64634 + if (!($source = self::box('fopen', $originFile, 'r'))) { + throw new IOException(\sprintf('Failed to copy "%s" to "%s" because source file could not be opened for reading: ', $originFile, $targetFile) . self::$lastError, 0, null, $originFile); + } + // Stream context created to allow files overwrite when using FTP stream wrapper - disabled by default + if (!($target = self::box('fopen', $targetFile, 'w', \false, \stream_context_create(['ftp' => ['overwrite' => \true]])))) { + throw new IOException(\sprintf('Failed to copy "%s" to "%s" because target file could not be opened for writing: ', $originFile, $targetFile) . self::$lastError, 0, null, $originFile); + } + $bytesCopied = \stream_copy_to_stream($source, $target); + \fclose($source); + \fclose($target); + unset($source, $target); + if (!\is_file($targetFile)) { + throw new IOException(\sprintf('Failed to copy "%s" to "%s".', $originFile, $targetFile), 0, null, $originFile); + } + if ($originIsLocal) { + // Like `cp`, preserve executable permission bits + self::box('chmod', $targetFile, \fileperms($targetFile) | \fileperms($originFile) & 0111); + if ($bytesCopied !== ($bytesOrigin = \filesize($originFile))) { + throw new IOException(\sprintf('Failed to copy the whole content of "%s" to "%s" (%g of %g bytes copied).', $originFile, $targetFile, $bytesCopied, $bytesOrigin), 0, null, $originFile); + } + } + } + } + /** + * Creates a directory recursively. + * + * @return void + * + * @throws IOException On any directory creation failure + * @param string|iterable $dirs + */ + public function mkdir($dirs, int $mode = 0777) + { + foreach ($this->toIterable($dirs) as $dir) { + if (\is_dir($dir)) { + continue; + } + if (!self::box('mkdir', $dir, $mode, \true) && !\is_dir($dir)) { + throw new IOException(\sprintf('Failed to create "%s": ', $dir) . self::$lastError, 0, null, $dir); + } + } + } + /** + * Checks the existence of files or directories. + * @param string|iterable $files + */ + public function exists($files) : bool + { + $maxPathLength = \PHP_MAXPATHLEN - 2; + foreach ($this->toIterable($files) as $file) { + if (\strlen($file) > $maxPathLength) { + throw new IOException(\sprintf('Could not check if file exist because path length exceeds %d characters.', $maxPathLength), 0, null, $file); + } + if (!\file_exists($file)) { + return \false; + } + } + return \true; + } + /** + * Sets access and modification time of file. + * + * @param int|null $time The touch time as a Unix timestamp, if not supplied the current system time is used + * @param int|null $atime The access time as a Unix timestamp, if not supplied the current system time is used + * + * @return void + * + * @throws IOException When touch fails + * @param string|iterable $files + */ + public function touch($files, ?int $time = null, ?int $atime = null) + { + foreach ($this->toIterable($files) as $file) { + if (!($time ? self::box('touch', $file, $time, $atime) : self::box('touch', $file))) { + throw new IOException(\sprintf('Failed to touch "%s": ', $file) . self::$lastError, 0, null, $file); + } + } + } + /** + * Removes files or directories. + * + * @return void + * + * @throws IOException When removal fails + * @param string|iterable $files + */ + public function remove($files) + { + if ($files instanceof \Traversable) { + $files = \iterator_to_array($files, \false); + } elseif (!\is_array($files)) { + $files = [$files]; + } + self::doRemove($files, \false); + } + private static function doRemove(array $files, bool $isRecursive) : void + { + $files = \array_reverse($files); + foreach ($files as $file) { + if (\is_link($file)) { + // See https://bugs.php.net/52176 + if (!(self::box('unlink', $file) || '\\' !== \DIRECTORY_SEPARATOR || self::box('rmdir', $file)) && \file_exists($file)) { + throw new IOException(\sprintf('Failed to remove symlink "%s": ', $file) . self::$lastError); + } + } elseif (\is_dir($file)) { + if (!$isRecursive) { + $tmpName = \dirname(\realpath($file)) . '/.' . \strrev(\strtr(\base64_encode(\random_bytes(2)), '/=', '-_')); + if (\file_exists($tmpName)) { + try { + self::doRemove([$tmpName], \true); + } catch (IOException $exception) { + } + } + if (!\file_exists($tmpName) && self::box('rename', $file, $tmpName)) { + $origFile = $file; + $file = $tmpName; + } else { + $origFile = null; + } + } + $filesystemIterator = new \FilesystemIterator($file, \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::SKIP_DOTS); + self::doRemove(\iterator_to_array($filesystemIterator, \true), \true); + if (!self::box('rmdir', $file) && \file_exists($file) && !$isRecursive) { + $lastError = self::$lastError; + if (null !== $origFile && self::box('rename', $file, $origFile)) { + $file = $origFile; + } + throw new IOException(\sprintf('Failed to remove directory "%s": ', $file) . $lastError); + } + } elseif (!self::box('unlink', $file) && (\strpos(self::$lastError, 'Permission denied') !== \false || \file_exists($file))) { + throw new IOException(\sprintf('Failed to remove file "%s": ', $file) . self::$lastError); + } + } + } + /** + * Change mode for an array of files or directories. + * + * @param int $mode The new mode (octal) + * @param int $umask The mode mask (octal) + * @param bool $recursive Whether change the mod recursively or not + * + * @return void + * + * @throws IOException When the change fails + * @param string|iterable $files + */ + public function chmod($files, int $mode, int $umask = 00, bool $recursive = \false) + { + foreach ($this->toIterable($files) as $file) { + if (!self::box('chmod', $file, $mode & ~$umask)) { + throw new IOException(\sprintf('Failed to chmod file "%s": ', $file) . self::$lastError, 0, null, $file); + } + if ($recursive && \is_dir($file) && !\is_link($file)) { + $this->chmod(new \FilesystemIterator($file), $mode, $umask, \true); + } + } + } + /** + * Change the owner of an array of files or directories. + * + * @param string|int $user A user name or number + * @param bool $recursive Whether change the owner recursively or not + * + * @return void + * + * @throws IOException When the change fails + * @param string|iterable $files + */ + public function chown($files, $user, bool $recursive = \false) + { + foreach ($this->toIterable($files) as $file) { + if ($recursive && \is_dir($file) && !\is_link($file)) { + $this->chown(new \FilesystemIterator($file), $user, \true); + } + if (\is_link($file) && \function_exists('lchown')) { + if (!self::box('lchown', $file, $user)) { + throw new IOException(\sprintf('Failed to chown file "%s": ', $file) . self::$lastError, 0, null, $file); + } + } else { + if (!self::box('chown', $file, $user)) { + throw new IOException(\sprintf('Failed to chown file "%s": ', $file) . self::$lastError, 0, null, $file); + } + } + } + } + /** + * Change the group of an array of files or directories. + * + * @param string|int $group A group name or number + * @param bool $recursive Whether change the group recursively or not + * + * @return void + * + * @throws IOException When the change fails + * @param string|iterable $files + */ + public function chgrp($files, $group, bool $recursive = \false) + { + foreach ($this->toIterable($files) as $file) { + if ($recursive && \is_dir($file) && !\is_link($file)) { + $this->chgrp(new \FilesystemIterator($file), $group, \true); + } + if (\is_link($file) && \function_exists('lchgrp')) { + if (!self::box('lchgrp', $file, $group)) { + throw new IOException(\sprintf('Failed to chgrp file "%s": ', $file) . self::$lastError, 0, null, $file); + } + } else { + if (!self::box('chgrp', $file, $group)) { + throw new IOException(\sprintf('Failed to chgrp file "%s": ', $file) . self::$lastError, 0, null, $file); + } + } + } + } + /** + * Renames a file or a directory. + * + * @return void + * + * @throws IOException When target file or directory already exists + * @throws IOException When origin cannot be renamed + */ + public function rename(string $origin, string $target, bool $overwrite = \false) + { + // we check that target does not exist + if (!$overwrite && $this->isReadable($target)) { + throw new IOException(\sprintf('Cannot rename because the target "%s" already exists.', $target), 0, null, $target); + } + if (!self::box('rename', $origin, $target)) { + if (\is_dir($origin)) { + // See https://bugs.php.net/54097 & https://php.net/rename#113943 + $this->mirror($origin, $target, null, ['override' => $overwrite, 'delete' => $overwrite]); + $this->remove($origin); + return; + } + throw new IOException(\sprintf('Cannot rename "%s" to "%s": ', $origin, $target) . self::$lastError, 0, null, $target); + } + } + /** + * Tells whether a file exists and is readable. + * + * @throws IOException When windows path is longer than 258 characters + */ + private function isReadable(string $filename) : bool + { + $maxPathLength = \PHP_MAXPATHLEN - 2; + if (\strlen($filename) > $maxPathLength) { + throw new IOException(\sprintf('Could not check if file is readable because path length exceeds %d characters.', $maxPathLength), 0, null, $filename); + } + return \is_readable($filename); + } + /** + * Creates a symbolic link or copy a directory. + * + * @return void + * + * @throws IOException When symlink fails + */ + public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = \false) + { + self::assertFunctionExists('symlink'); + if ('\\' === \DIRECTORY_SEPARATOR) { + $originDir = \strtr($originDir, '/', '\\'); + $targetDir = \strtr($targetDir, '/', '\\'); + if ($copyOnWindows) { + $this->mirror($originDir, $targetDir); + return; + } + } + $this->mkdir(\dirname($targetDir)); + if (\is_link($targetDir)) { + if (\readlink($targetDir) === $originDir) { + return; + } + $this->remove($targetDir); + } + if (!self::box('symlink', $originDir, $targetDir)) { + $this->linkException($originDir, $targetDir, 'symbolic'); + } + } + /** + * Creates a hard link, or several hard links to a file. + * + * @param string|string[] $targetFiles The target file(s) + * + * @return void + * + * @throws FileNotFoundException When original file is missing or not a file + * @throws IOException When link fails, including if link already exists + */ + public function hardlink(string $originFile, $targetFiles) + { + self::assertFunctionExists('link'); + if (!$this->exists($originFile)) { + throw new FileNotFoundException(null, 0, null, $originFile); + } + if (!\is_file($originFile)) { + throw new FileNotFoundException(\sprintf('Origin file "%s" is not a file.', $originFile)); + } + foreach ($this->toIterable($targetFiles) as $targetFile) { + if (\is_file($targetFile)) { + if (\fileinode($originFile) === \fileinode($targetFile)) { + continue; + } + $this->remove($targetFile); + } + if (!self::box('link', $originFile, $targetFile)) { + $this->linkException($originFile, $targetFile, 'hard'); + } + } + } + /** + * @param string $linkType Name of the link type, typically 'symbolic' or 'hard' + * @return never + */ + private function linkException(string $origin, string $target, string $linkType) + { + if (self::$lastError) { + if ('\\' === \DIRECTORY_SEPARATOR && \strpos(self::$lastError, 'error code(1314)') !== \false) { + throw new IOException(\sprintf('Unable to create "%s" link due to error code 1314: \'A required privilege is not held by the client\'. Do you have the required Administrator-rights?', $linkType), 0, null, $target); + } + } + throw new IOException(\sprintf('Failed to create "%s" link from "%s" to "%s": ', $linkType, $origin, $target) . self::$lastError, 0, null, $target); + } + /** + * Resolves links in paths. + * + * With $canonicalize = false (default) + * - if $path does not exist or is not a link, returns null + * - if $path is a link, returns the next direct target of the link without considering the existence of the target + * + * With $canonicalize = true + * - if $path does not exist, returns null + * - if $path exists, returns its absolute fully resolved final version + */ + public function readlink(string $path, bool $canonicalize = \false) : ?string + { + if (!$canonicalize && !\is_link($path)) { + return null; + } + if ($canonicalize) { + if (!$this->exists($path)) { + return null; + } + return \realpath($path); + } + return \readlink($path); + } + /** + * Given an existing path, convert it to a path relative to a given starting path. + */ + public function makePathRelative(string $endPath, string $startPath) : string + { + if (!$this->isAbsolutePath($startPath)) { + throw new InvalidArgumentException(\sprintf('The start path "%s" is not absolute.', $startPath)); + } + if (!$this->isAbsolutePath($endPath)) { + throw new InvalidArgumentException(\sprintf('The end path "%s" is not absolute.', $endPath)); + } + // Normalize separators on Windows + if ('\\' === \DIRECTORY_SEPARATOR) { + $endPath = \str_replace('\\', '/', $endPath); + $startPath = \str_replace('\\', '/', $startPath); + } + $splitDriveLetter = function ($path) { + return \strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && \ctype_alpha($path[0]) ? [\substr($path, 2), \strtoupper($path[0])] : [$path, null]; + }; + $splitPath = function ($path) { + $result = []; + foreach (\explode('/', \trim($path, '/')) as $segment) { + if ('..' === $segment) { + \array_pop($result); + } elseif ('.' !== $segment && '' !== $segment) { + $result[] = $segment; + } + } + return $result; + }; + [$endPath, $endDriveLetter] = $splitDriveLetter($endPath); + [$startPath, $startDriveLetter] = $splitDriveLetter($startPath); + $startPathArr = $splitPath($startPath); + $endPathArr = $splitPath($endPath); + if ($endDriveLetter && $startDriveLetter && $endDriveLetter != $startDriveLetter) { + // End path is on another drive, so no relative path exists + return $endDriveLetter . ':/' . ($endPathArr ? \implode('/', $endPathArr) . '/' : ''); + } + // Find for which directory the common path stops + $index = 0; + while (isset($startPathArr[$index]) && isset($endPathArr[$index]) && $startPathArr[$index] === $endPathArr[$index]) { + ++$index; + } + // Determine how deep the start path is relative to the common path (ie, "web/bundles" = 2 levels) + if (1 === \count($startPathArr) && '' === $startPathArr[0]) { + $depth = 0; + } else { + $depth = \count($startPathArr) - $index; + } + // Repeated "../" for each level need to reach the common path + $traverser = \str_repeat('../', $depth); + $endPathRemainder = \implode('/', \array_slice($endPathArr, $index)); + // Construct $endPath from traversing to the common path, then to the remaining $endPath + $relativePath = $traverser . ('' !== $endPathRemainder ? $endPathRemainder . '/' : ''); + return '' === $relativePath ? './' : $relativePath; + } + /** + * Mirrors a directory to another. + * + * Copies files and directories from the origin directory into the target directory. By default: + * + * - existing files in the target directory will be overwritten, except if they are newer (see the `override` option) + * - files in the target directory that do not exist in the source directory will not be deleted (see the `delete` option) + * + * @param \Traversable|null $iterator Iterator that filters which files and directories to copy, if null a recursive iterator is created + * @param array $options An array of boolean options + * Valid options are: + * - $options['override'] If true, target files newer than origin files are overwritten (see copy(), defaults to false) + * - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink(), defaults to false) + * - $options['delete'] Whether to delete files that are not in the source directory (defaults to false) + * + * @return void + * + * @throws IOException When file type is unknown + */ + public function mirror(string $originDir, string $targetDir, ?\Traversable $iterator = null, array $options = []) + { + $targetDir = \rtrim($targetDir, '/\\'); + $originDir = \rtrim($originDir, '/\\'); + $originDirLen = \strlen($originDir); + if (!$this->exists($originDir)) { + throw new IOException(\sprintf('The origin directory specified "%s" was not found.', $originDir), 0, null, $originDir); + } + // Iterate in destination folder to remove obsolete entries + if ($this->exists($targetDir) && isset($options['delete']) && $options['delete']) { + $deleteIterator = $iterator; + if (null === $deleteIterator) { + $flags = \FilesystemIterator::SKIP_DOTS; + $deleteIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($targetDir, $flags), \RecursiveIteratorIterator::CHILD_FIRST); + } + $targetDirLen = \strlen($targetDir); + foreach ($deleteIterator as $file) { + $origin = $originDir . \substr($file->getPathname(), $targetDirLen); + if (!$this->exists($origin)) { + $this->remove($file); + } + } + } + $copyOnWindows = $options['copy_on_windows'] ?? \false; + if (null === $iterator) { + $flags = $copyOnWindows ? \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS : \FilesystemIterator::SKIP_DOTS; + $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($originDir, $flags), \RecursiveIteratorIterator::SELF_FIRST); + } + $this->mkdir($targetDir); + $filesCreatedWhileMirroring = []; + foreach ($iterator as $file) { + if ($file->getPathname() === $targetDir || $file->getRealPath() === $targetDir || isset($filesCreatedWhileMirroring[$file->getRealPath()])) { + continue; + } + $target = $targetDir . \substr($file->getPathname(), $originDirLen); + $filesCreatedWhileMirroring[$target] = \true; + if (!$copyOnWindows && \is_link($file)) { + $this->symlink($file->getLinkTarget(), $target); + } elseif (\is_dir($file)) { + $this->mkdir($target); + } elseif (\is_file($file)) { + $this->copy($file, $target, $options['override'] ?? \false); + } else { + throw new IOException(\sprintf('Unable to guess "%s" file type.', $file), 0, null, $file); + } + } + } + /** + * Returns whether the file path is an absolute path. + */ + public function isAbsolutePath(string $file) : bool + { + return '' !== $file && (\strspn($file, '/\\', 0, 1) || \strlen($file) > 3 && \ctype_alpha($file[0]) && ':' === $file[1] && \strspn($file, '/\\', 2, 1) || null !== \parse_url($file, \PHP_URL_SCHEME)); + } + /** + * Creates a temporary file with support for custom stream wrappers. + * + * @param string $prefix The prefix of the generated temporary filename + * Note: Windows uses only the first three characters of prefix + * @param string $suffix The suffix of the generated temporary filename + * + * @return string The new temporary filename (with path), or throw an exception on failure + */ + public function tempnam(string $dir, string $prefix, string $suffix = '') : string + { + [$scheme, $hierarchy] = $this->getSchemeAndHierarchy($dir); + // If no scheme or scheme is "file" or "gs" (Google Cloud) create temp file in local filesystem + if ((null === $scheme || 'file' === $scheme || 'gs' === $scheme) && '' === $suffix) { + // If tempnam failed or no scheme return the filename otherwise prepend the scheme + if ($tmpFile = self::box('tempnam', $hierarchy, $prefix)) { + if (null !== $scheme && 'gs' !== $scheme) { + return $scheme . '://' . $tmpFile; + } + return $tmpFile; + } + throw new IOException('A temporary file could not be created: ' . self::$lastError); + } + // Loop until we create a valid temp file or have reached 10 attempts + for ($i = 0; $i < 10; ++$i) { + // Create a unique filename + $tmpFile = $dir . '/' . $prefix . \uniqid(\mt_rand(), \true) . $suffix; + // Use fopen instead of file_exists as some streams do not support stat + // Use mode 'x+' to atomically check existence and create to avoid a TOCTOU vulnerability + if (!($handle = self::box('fopen', $tmpFile, 'x+'))) { + continue; + } + // Close the file if it was successfully opened + self::box('fclose', $handle); + return $tmpFile; + } + throw new IOException('A temporary file could not be created: ' . self::$lastError); + } + /** + * Atomically dumps content into a file. + * + * @param string|resource $content The data to write into the file + * + * @return void + * + * @throws IOException if the file cannot be written to + */ + public function dumpFile(string $filename, $content) + { + if (\is_array($content)) { + throw new \TypeError(\sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); + } + $dir = \dirname($filename); + if (\is_link($filename) && ($linkTarget = $this->readlink($filename))) { + $this->dumpFile(Path::makeAbsolute($linkTarget, $dir), $content); + return; + } + if (!\is_dir($dir)) { + $this->mkdir($dir); + } + // Will create a temp file with 0600 access rights + // when the filesystem supports chmod. + $tmpFile = $this->tempnam($dir, \basename($filename)); + try { + if (\false === self::box('file_put_contents', $tmpFile, $content)) { + throw new IOException(\sprintf('Failed to write file "%s": ', $filename) . self::$lastError, 0, null, $filename); + } + self::box('chmod', $tmpFile, \file_exists($filename) ? \fileperms($filename) : 0666 & ~\umask()); + $this->rename($tmpFile, $filename, \true); + } finally { + if (\file_exists($tmpFile)) { + self::box('unlink', $tmpFile); + } + } + } + /** + * Appends content to an existing file. + * + * @param string|resource $content The content to append + * @param bool $lock Whether the file should be locked when writing to it + * + * @return void + * + * @throws IOException If the file is not writable + */ + public function appendToFile(string $filename, $content) + { + if (\is_array($content)) { + throw new \TypeError(\sprintf('Argument 2 passed to "%s()" must be string or resource, array given.', __METHOD__)); + } + $dir = \dirname($filename); + if (!\is_dir($dir)) { + $this->mkdir($dir); + } + $lock = \func_num_args() > 2 && \func_get_arg(2); + if (\false === self::box('file_put_contents', $filename, $content, \FILE_APPEND | ($lock ? \LOCK_EX : 0))) { + throw new IOException(\sprintf('Failed to write file "%s": ', $filename) . self::$lastError, 0, null, $filename); + } + } + /** + * @param string|iterable $files + */ + private function toIterable($files) : iterable + { + return \is_iterable($files) ? $files : [$files]; + } + /** + * Gets a 2-tuple of scheme (may be null) and hierarchical part of a filename (e.g. file:///tmp -> [file, tmp]). + */ + private function getSchemeAndHierarchy(string $filename) : array + { + $components = \explode('://', $filename, 2); + return 2 === \count($components) ? [$components[0], $components[1]] : [null, $components[0]]; + } + private static function assertFunctionExists(string $func) : void + { + if (!\function_exists($func)) { + throw new IOException(\sprintf('Unable to perform filesystem operation because the "%s()" function has been disabled.', $func)); + } + } + /** + * @param mixed ...$args + * @return mixed + */ + private static function box(string $func, ...$args) + { + self::assertFunctionExists($func); + self::$lastError = null; + \set_error_handler(\Closure::fromCallable([self::class, 'handleError'])); + try { + return $func(...$args); + } finally { + \restore_error_handler(); + } + } + /** + * @internal + */ + public static function handleError(int $type, string $msg) : void + { + self::$lastError = $msg; + } +} diff --git a/vendor/symfony/filesystem/LICENSE b/vendor/symfony/filesystem/LICENSE new file mode 100644 index 00000000..0138f8f0 --- /dev/null +++ b/vendor/symfony/filesystem/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-present Fabien Potencier + +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/symfony/filesystem/Path.php b/vendor/symfony/filesystem/Path.php new file mode 100644 index 00000000..50887478 --- /dev/null +++ b/vendor/symfony/filesystem/Path.php @@ -0,0 +1,708 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Filesystem; + +use RuleDocGenerator202403\Symfony\Component\Filesystem\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Filesystem\Exception\RuntimeException; +/** + * Contains utility methods for handling path strings. + * + * The methods in this class are able to deal with both UNIX and Windows paths + * with both forward and backward slashes. All methods return normalized parts + * containing only forward slashes and no excess "." and ".." segments. + * + * @author Bernhard Schussek + * @author Thomas Schulz + * @author Théo Fidry + */ +final class Path +{ + /** + * The number of buffer entries that triggers a cleanup operation. + */ + private const CLEANUP_THRESHOLD = 1250; + /** + * The buffer size after the cleanup operation. + */ + private const CLEANUP_SIZE = 1000; + /** + * Buffers input/output of {@link canonicalize()}. + * + * @var array + */ + private static $buffer = []; + /** + * @var int + */ + private static $bufferSize = 0; + /** + * Canonicalizes the given path. + * + * During normalization, all slashes are replaced by forward slashes ("/"). + * Furthermore, all "." and ".." segments are removed as far as possible. + * ".." segments at the beginning of relative paths are not removed. + * + * ```php + * echo Path::canonicalize("\symfony\puli\..\css\style.css"); + * // => /symfony/css/style.css + * + * echo Path::canonicalize("../css/./style.css"); + * // => ../css/style.css + * ``` + * + * This method is able to deal with both UNIX and Windows paths. + */ + public static function canonicalize(string $path) : string + { + if ('' === $path) { + return ''; + } + // This method is called by many other methods in this class. Buffer + // the canonicalized paths to make up for the severe performance + // decrease. + if (isset(self::$buffer[$path])) { + return self::$buffer[$path]; + } + // Replace "~" with user's home directory. + if ('~' === $path[0]) { + $path = self::getHomeDirectory() . \substr($path, 1); + } + $path = self::normalize($path); + [$root, $pathWithoutRoot] = self::split($path); + $canonicalParts = self::findCanonicalParts($root, $pathWithoutRoot); + // Add the root directory again + self::$buffer[$path] = $canonicalPath = $root . \implode('/', $canonicalParts); + ++self::$bufferSize; + // Clean up regularly to prevent memory leaks + if (self::$bufferSize > self::CLEANUP_THRESHOLD) { + self::$buffer = \array_slice(self::$buffer, -self::CLEANUP_SIZE, null, \true); + self::$bufferSize = self::CLEANUP_SIZE; + } + return $canonicalPath; + } + /** + * Normalizes the given path. + * + * During normalization, all slashes are replaced by forward slashes ("/"). + * Contrary to {@link canonicalize()}, this method does not remove invalid + * or dot path segments. Consequently, it is much more efficient and should + * be used whenever the given path is known to be a valid, absolute system + * path. + * + * This method is able to deal with both UNIX and Windows paths. + */ + public static function normalize(string $path) : string + { + return \str_replace('\\', '/', $path); + } + /** + * Returns the directory part of the path. + * + * This method is similar to PHP's dirname(), but handles various cases + * where dirname() returns a weird result: + * + * - dirname() does not accept backslashes on UNIX + * - dirname("C:/symfony") returns "C:", not "C:/" + * - dirname("C:/") returns ".", not "C:/" + * - dirname("C:") returns ".", not "C:/" + * - dirname("symfony") returns ".", not "" + * - dirname() does not canonicalize the result + * + * This method fixes these shortcomings and behaves like dirname() + * otherwise. + * + * The result is a canonical path. + * + * @return string The canonical directory part. Returns the root directory + * if the root directory is passed. Returns an empty string + * if a relative path is passed that contains no slashes. + * Returns an empty string if an empty string is passed. + */ + public static function getDirectory(string $path) : string + { + if ('' === $path) { + return ''; + } + $path = self::canonicalize($path); + // Maintain scheme + if (\false !== ($schemeSeparatorPosition = \strpos($path, '://'))) { + $scheme = \substr($path, 0, $schemeSeparatorPosition + 3); + $path = \substr($path, $schemeSeparatorPosition + 3); + } else { + $scheme = ''; + } + if (\false === ($dirSeparatorPosition = \strrpos($path, '/'))) { + return ''; + } + // Directory equals root directory "/" + if (0 === $dirSeparatorPosition) { + return $scheme . '/'; + } + // Directory equals Windows root "C:/" + if (2 === $dirSeparatorPosition && \ctype_alpha($path[0]) && ':' === $path[1]) { + return $scheme . \substr($path, 0, 3); + } + return $scheme . \substr($path, 0, $dirSeparatorPosition); + } + /** + * Returns canonical path of the user's home directory. + * + * Supported operating systems: + * + * - UNIX + * - Windows8 and upper + * + * If your operating system or environment isn't supported, an exception is thrown. + * + * The result is a canonical path. + * + * @throws RuntimeException If your operating system or environment isn't supported + */ + public static function getHomeDirectory() : string + { + // For UNIX support + if (\getenv('HOME')) { + return self::canonicalize(\getenv('HOME')); + } + // For >= Windows8 support + if (\getenv('HOMEDRIVE') && \getenv('HOMEPATH')) { + return self::canonicalize(\getenv('HOMEDRIVE') . \getenv('HOMEPATH')); + } + throw new RuntimeException("Cannot find the home directory path: Your environment or operating system isn't supported."); + } + /** + * Returns the root directory of a path. + * + * The result is a canonical path. + * + * @return string The canonical root directory. Returns an empty string if + * the given path is relative or empty. + */ + public static function getRoot(string $path) : string + { + if ('' === $path) { + return ''; + } + // Maintain scheme + if (\false !== ($schemeSeparatorPosition = \strpos($path, '://'))) { + $scheme = \substr($path, 0, $schemeSeparatorPosition + 3); + $path = \substr($path, $schemeSeparatorPosition + 3); + } else { + $scheme = ''; + } + $firstCharacter = $path[0]; + // UNIX root "/" or "\" (Windows style) + if ('/' === $firstCharacter || '\\' === $firstCharacter) { + return $scheme . '/'; + } + $length = \strlen($path); + // Windows root + if ($length > 1 && ':' === $path[1] && \ctype_alpha($firstCharacter)) { + // Special case: "C:" + if (2 === $length) { + return $scheme . $path . '/'; + } + // Normal case: "C:/ or "C:\" + if ('/' === $path[2] || '\\' === $path[2]) { + return $scheme . $firstCharacter . $path[1] . '/'; + } + } + return ''; + } + /** + * Returns the file name without the extension from a file path. + * + * @param string|null $extension if specified, only that extension is cut + * off (may contain leading dot) + */ + public static function getFilenameWithoutExtension(string $path, ?string $extension = null) : string + { + if ('' === $path) { + return ''; + } + if (null !== $extension) { + // remove extension and trailing dot + return \rtrim(\basename($path, $extension), '.'); + } + return \pathinfo($path, \PATHINFO_FILENAME); + } + /** + * Returns the extension from a file path (without leading dot). + * + * @param bool $forceLowerCase forces the extension to be lower-case + */ + public static function getExtension(string $path, bool $forceLowerCase = \false) : string + { + if ('' === $path) { + return ''; + } + $extension = \pathinfo($path, \PATHINFO_EXTENSION); + if ($forceLowerCase) { + $extension = self::toLower($extension); + } + return $extension; + } + /** + * Returns whether the path has an (or the specified) extension. + * + * @param string $path the path string + * @param string|string[]|null $extensions if null or not provided, checks if + * an extension exists, otherwise + * checks for the specified extension + * or array of extensions (with or + * without leading dot) + * @param bool $ignoreCase whether to ignore case-sensitivity + */ + public static function hasExtension(string $path, $extensions = null, bool $ignoreCase = \false) : bool + { + if ('' === $path) { + return \false; + } + $actualExtension = self::getExtension($path, $ignoreCase); + // Only check if path has any extension + if ([] === $extensions || null === $extensions) { + return '' !== $actualExtension; + } + if (\is_string($extensions)) { + $extensions = [$extensions]; + } + foreach ($extensions as $key => $extension) { + if ($ignoreCase) { + $extension = self::toLower($extension); + } + // remove leading '.' in extensions array + $extensions[$key] = \ltrim($extension, '.'); + } + return \in_array($actualExtension, $extensions, \true); + } + /** + * Changes the extension of a path string. + * + * @param string $path The path string with filename.ext to change. + * @param string $extension new extension (with or without leading dot) + * + * @return string the path string with new file extension + */ + public static function changeExtension(string $path, string $extension) : string + { + if ('' === $path) { + return ''; + } + $actualExtension = self::getExtension($path); + $extension = \ltrim($extension, '.'); + // No extension for paths + if ('/' === \substr($path, -1)) { + return $path; + } + // No actual extension in path + if (empty($actualExtension)) { + return $path . ('.' === \substr($path, -1) ? '' : '.') . $extension; + } + return \substr($path, 0, -\strlen($actualExtension)) . $extension; + } + public static function isAbsolute(string $path) : bool + { + if ('' === $path) { + return \false; + } + // Strip scheme + if (\false !== ($schemeSeparatorPosition = \strpos($path, '://'))) { + $path = \substr($path, $schemeSeparatorPosition + 3); + } + $firstCharacter = $path[0]; + // UNIX root "/" or "\" (Windows style) + if ('/' === $firstCharacter || '\\' === $firstCharacter) { + return \true; + } + // Windows root + if (\strlen($path) > 1 && \ctype_alpha($firstCharacter) && ':' === $path[1]) { + // Special case: "C:" + if (2 === \strlen($path)) { + return \true; + } + // Normal case: "C:/ or "C:\" + if ('/' === $path[2] || '\\' === $path[2]) { + return \true; + } + } + return \false; + } + public static function isRelative(string $path) : bool + { + return !self::isAbsolute($path); + } + /** + * Turns a relative path into an absolute path in canonical form. + * + * Usually, the relative path is appended to the given base path. Dot + * segments ("." and "..") are removed/collapsed and all slashes turned + * into forward slashes. + * + * ```php + * echo Path::makeAbsolute("../style.css", "/symfony/puli/css"); + * // => /symfony/puli/style.css + * ``` + * + * If an absolute path is passed, that path is returned unless its root + * directory is different than the one of the base path. In that case, an + * exception is thrown. + * + * ```php + * Path::makeAbsolute("/style.css", "/symfony/puli/css"); + * // => /style.css + * + * Path::makeAbsolute("C:/style.css", "C:/symfony/puli/css"); + * // => C:/style.css + * + * Path::makeAbsolute("C:/style.css", "/symfony/puli/css"); + * // InvalidArgumentException + * ``` + * + * If the base path is not an absolute path, an exception is thrown. + * + * The result is a canonical path. + * + * @param string $basePath an absolute base path + * + * @throws InvalidArgumentException if the base path is not absolute or if + * the given path is an absolute path with + * a different root than the base path + */ + public static function makeAbsolute(string $path, string $basePath) : string + { + if ('' === $basePath) { + throw new InvalidArgumentException(\sprintf('The base path must be a non-empty string. Got: "%s".', $basePath)); + } + if (!self::isAbsolute($basePath)) { + throw new InvalidArgumentException(\sprintf('The base path "%s" is not an absolute path.', $basePath)); + } + if (self::isAbsolute($path)) { + return self::canonicalize($path); + } + if (\false !== ($schemeSeparatorPosition = \strpos($basePath, '://'))) { + $scheme = \substr($basePath, 0, $schemeSeparatorPosition + 3); + $basePath = \substr($basePath, $schemeSeparatorPosition + 3); + } else { + $scheme = ''; + } + return $scheme . self::canonicalize(\rtrim($basePath, '/\\') . '/' . $path); + } + /** + * Turns a path into a relative path. + * + * The relative path is created relative to the given base path: + * + * ```php + * echo Path::makeRelative("/symfony/style.css", "/symfony/puli"); + * // => ../style.css + * ``` + * + * If a relative path is passed and the base path is absolute, the relative + * path is returned unchanged: + * + * ```php + * Path::makeRelative("style.css", "/symfony/puli/css"); + * // => style.css + * ``` + * + * If both paths are relative, the relative path is created with the + * assumption that both paths are relative to the same directory: + * + * ```php + * Path::makeRelative("style.css", "symfony/puli/css"); + * // => ../../../style.css + * ``` + * + * If both paths are absolute, their root directory must be the same, + * otherwise an exception is thrown: + * + * ```php + * Path::makeRelative("C:/symfony/style.css", "/symfony/puli"); + * // InvalidArgumentException + * ``` + * + * If the passed path is absolute, but the base path is not, an exception + * is thrown as well: + * + * ```php + * Path::makeRelative("/symfony/style.css", "symfony/puli"); + * // InvalidArgumentException + * ``` + * + * If the base path is not an absolute path, an exception is thrown. + * + * The result is a canonical path. + * + * @throws InvalidArgumentException if the base path is not absolute or if + * the given path has a different root + * than the base path + */ + public static function makeRelative(string $path, string $basePath) : string + { + $path = self::canonicalize($path); + $basePath = self::canonicalize($basePath); + [$root, $relativePath] = self::split($path); + [$baseRoot, $relativeBasePath] = self::split($basePath); + // If the base path is given as absolute path and the path is already + // relative, consider it to be relative to the given absolute path + // already + if ('' === $root && '' !== $baseRoot) { + // If base path is already in its root + if ('' === $relativeBasePath) { + $relativePath = \ltrim($relativePath, './\\'); + } + return $relativePath; + } + // If the passed path is absolute, but the base path is not, we + // cannot generate a relative path + if ('' !== $root && '' === $baseRoot) { + throw new InvalidArgumentException(\sprintf('The absolute path "%s" cannot be made relative to the relative path "%s". You should provide an absolute base path instead.', $path, $basePath)); + } + // Fail if the roots of the two paths are different + if ($baseRoot && $root !== $baseRoot) { + throw new InvalidArgumentException(\sprintf('The path "%s" cannot be made relative to "%s", because they have different roots ("%s" and "%s").', $path, $basePath, $root, $baseRoot)); + } + if ('' === $relativeBasePath) { + return $relativePath; + } + // Build a "../../" prefix with as many "../" parts as necessary + $parts = \explode('/', $relativePath); + $baseParts = \explode('/', $relativeBasePath); + $dotDotPrefix = ''; + // Once we found a non-matching part in the prefix, we need to add + // "../" parts for all remaining parts + $match = \true; + foreach ($baseParts as $index => $basePart) { + if ($match && isset($parts[$index]) && $basePart === $parts[$index]) { + unset($parts[$index]); + continue; + } + $match = \false; + $dotDotPrefix .= '../'; + } + return \rtrim($dotDotPrefix . \implode('/', $parts), '/'); + } + /** + * Returns whether the given path is on the local filesystem. + */ + public static function isLocal(string $path) : bool + { + return '' !== $path && \strpos($path, '://') === \false; + } + /** + * Returns the longest common base path in canonical form of a set of paths or + * `null` if the paths are on different Windows partitions. + * + * Dot segments ("." and "..") are removed/collapsed and all slashes turned + * into forward slashes. + * + * ```php + * $basePath = Path::getLongestCommonBasePath( + * '/symfony/css/style.css', + * '/symfony/css/..' + * ); + * // => /symfony + * ``` + * + * The root is returned if no common base path can be found: + * + * ```php + * $basePath = Path::getLongestCommonBasePath( + * '/symfony/css/style.css', + * '/puli/css/..' + * ); + * // => / + * ``` + * + * If the paths are located on different Windows partitions, `null` is + * returned. + * + * ```php + * $basePath = Path::getLongestCommonBasePath( + * 'C:/symfony/css/style.css', + * 'D:/symfony/css/..' + * ); + * // => null + * ``` + */ + public static function getLongestCommonBasePath(string ...$paths) : ?string + { + [$bpRoot, $basePath] = self::split(self::canonicalize(\reset($paths))); + for (\next($paths); null !== \key($paths) && '' !== $basePath; \next($paths)) { + [$root, $path] = self::split(self::canonicalize(\current($paths))); + // If we deal with different roots (e.g. C:/ vs. D:/), it's time + // to quit + if ($root !== $bpRoot) { + return null; + } + // Make the base path shorter until it fits into path + while (\true) { + if ('.' === $basePath) { + // No more base paths + $basePath = ''; + // next path + continue 2; + } + // Prevent false positives for common prefixes + // see isBasePath() + if (\strncmp($path . '/', $basePath . '/', \strlen($basePath . '/')) === 0) { + // next path + continue 2; + } + $basePath = \dirname($basePath); + } + } + return $bpRoot . $basePath; + } + /** + * Joins two or more path strings into a canonical path. + */ + public static function join(string ...$paths) : string + { + $finalPath = null; + $wasScheme = \false; + foreach ($paths as $path) { + if ('' === $path) { + continue; + } + if (null === $finalPath) { + // For first part we keep slashes, like '/top', 'C:\' or 'phar://' + $finalPath = $path; + $wasScheme = \strpos($path, '://') !== \false; + continue; + } + // Only add slash if previous part didn't end with '/' or '\' + if (!\in_array(\substr($finalPath, -1), ['/', '\\'])) { + $finalPath .= '/'; + } + // If first part included a scheme like 'phar://' we allow \current part to start with '/', otherwise trim + $finalPath .= $wasScheme ? $path : \ltrim($path, '/'); + $wasScheme = \false; + } + if (null === $finalPath) { + return ''; + } + return self::canonicalize($finalPath); + } + /** + * Returns whether a path is a base path of another path. + * + * Dot segments ("." and "..") are removed/collapsed and all slashes turned + * into forward slashes. + * + * ```php + * Path::isBasePath('/symfony', '/symfony/css'); + * // => true + * + * Path::isBasePath('/symfony', '/symfony'); + * // => true + * + * Path::isBasePath('/symfony', '/symfony/..'); + * // => false + * + * Path::isBasePath('/symfony', '/puli'); + * // => false + * ``` + */ + public static function isBasePath(string $basePath, string $ofPath) : bool + { + $basePath = self::canonicalize($basePath); + $ofPath = self::canonicalize($ofPath); + // Append slashes to prevent false positives when two paths have + // a common prefix, for example /base/foo and /base/foobar. + // Don't append a slash for the root "/", because then that root + // won't be discovered as common prefix ("//" is not a prefix of + // "/foobar/"). + return \strncmp($ofPath . '/', \rtrim($basePath, '/') . '/', \strlen(\rtrim($basePath, '/') . '/')) === 0; + } + /** + * @return string[] + */ + private static function findCanonicalParts(string $root, string $pathWithoutRoot) : array + { + $parts = \explode('/', $pathWithoutRoot); + $canonicalParts = []; + // Collapse "." and "..", if possible + foreach ($parts as $part) { + if ('.' === $part || '' === $part) { + continue; + } + // Collapse ".." with the previous part, if one exists + // Don't collapse ".." if the previous part is also ".." + if ('..' === $part && \count($canonicalParts) > 0 && '..' !== $canonicalParts[\count($canonicalParts) - 1]) { + \array_pop($canonicalParts); + continue; + } + // Only add ".." prefixes for relative paths + if ('..' !== $part || '' === $root) { + $canonicalParts[] = $part; + } + } + return $canonicalParts; + } + /** + * Splits a canonical path into its root directory and the remainder. + * + * If the path has no root directory, an empty root directory will be + * returned. + * + * If the root directory is a Windows style partition, the resulting root + * will always contain a trailing slash. + * + * list ($root, $path) = Path::split("C:/symfony") + * // => ["C:/", "symfony"] + * + * list ($root, $path) = Path::split("C:") + * // => ["C:/", ""] + * + * @return array{string, string} an array with the root directory and the remaining relative path + */ + private static function split(string $path) : array + { + if ('' === $path) { + return ['', '']; + } + // Remember scheme as part of the root, if any + if (\false !== ($schemeSeparatorPosition = \strpos($path, '://'))) { + $root = \substr($path, 0, $schemeSeparatorPosition + 3); + $path = \substr($path, $schemeSeparatorPosition + 3); + } else { + $root = ''; + } + $length = \strlen($path); + // Remove and remember root directory + if (\strncmp($path, '/', \strlen('/')) === 0) { + $root .= '/'; + $path = $length > 1 ? \substr($path, 1) : ''; + } elseif ($length > 1 && \ctype_alpha($path[0]) && ':' === $path[1]) { + if (2 === $length) { + // Windows special case: "C:" + $root .= $path . '/'; + $path = ''; + } elseif ('/' === $path[2]) { + // Windows normal case: "C:/".. + $root .= \substr($path, 0, 3); + $path = $length > 3 ? \substr($path, 3) : ''; + } + } + return [$root, $path]; + } + private static function toLower(string $string) : string + { + if (\false !== ($encoding = \mb_detect_encoding($string, null, \true))) { + return \mb_strtolower($string, $encoding); + } + return \strtolower($string); + } + private function __construct() + { + } +} diff --git a/vendor/symfony/filesystem/README.md b/vendor/symfony/filesystem/README.md new file mode 100644 index 00000000..f2f6d45f --- /dev/null +++ b/vendor/symfony/filesystem/README.md @@ -0,0 +1,13 @@ +Filesystem Component +==================== + +The Filesystem component provides basic utilities for the filesystem. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/filesystem.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/filesystem/composer.json b/vendor/symfony/filesystem/composer.json new file mode 100644 index 00000000..01a95665 --- /dev/null +++ b/vendor/symfony/filesystem/composer.json @@ -0,0 +1,32 @@ +{ + "name": "symfony\/filesystem", + "type": "library", + "description": "Provides basic utilities for the filesystem", + "keywords": [], + "homepage": "https:\/\/symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "require": { + "php": ">=8.1", + "symfony\/polyfill-ctype": "~1.8", + "symfony\/polyfill-mbstring": "~1.8" + }, + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "\/Tests\/" + ] + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/vendor/symfony/polyfill-ctype/Ctype.php b/vendor/symfony/polyfill-ctype/Ctype.php new file mode 100644 index 00000000..357ccc17 --- /dev/null +++ b/vendor/symfony/polyfill-ctype/Ctype.php @@ -0,0 +1,205 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Symfony\Polyfill\Ctype; + +/** + * Ctype implementation through regex. + * + * @internal + * + * @author Gert de Pagter + */ +final class Ctype +{ + /** + * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. + * + * @see https://php.net/ctype-alnum + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_alnum($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^A-Za-z0-9]/', $text); + } + /** + * Returns TRUE if every character in text is a letter, FALSE otherwise. + * + * @see https://php.net/ctype-alpha + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_alpha($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^A-Za-z]/', $text); + } + /** + * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. + * + * @see https://php.net/ctype-cntrl + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_cntrl($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^\\x00-\\x1f\\x7f]/', $text); + } + /** + * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. + * + * @see https://php.net/ctype-digit + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_digit($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^0-9]/', $text); + } + /** + * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. + * + * @see https://php.net/ctype-graph + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_graph($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^!-~]/', $text); + } + /** + * Returns TRUE if every character in text is a lowercase letter. + * + * @see https://php.net/ctype-lower + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_lower($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^a-z]/', $text); + } + /** + * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. + * + * @see https://php.net/ctype-print + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_print($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^ -~]/', $text); + } + /** + * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. + * + * @see https://php.net/ctype-punct + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_punct($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^!-\\/\\:-@\\[-`\\{-~]/', $text); + } + /** + * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. + * + * @see https://php.net/ctype-space + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_space($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^\\s]/', $text); + } + /** + * Returns TRUE if every character in text is an uppercase letter. + * + * @see https://php.net/ctype-upper + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_upper($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^A-Z]/', $text); + } + /** + * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. + * + * @see https://php.net/ctype-xdigit + * + * @param mixed $text + * + * @return bool + */ + public static function ctype_xdigit($text) + { + $text = self::convert_int_to_char_for_ctype($text, __FUNCTION__); + return \is_string($text) && '' !== $text && !\preg_match('/[^A-Fa-f0-9]/', $text); + } + /** + * Converts integers to their char versions according to normal ctype behaviour, if needed. + * + * If an integer between -128 and 255 inclusive is provided, + * it is interpreted as the ASCII value of a single character + * (negative values have 256 added in order to allow characters in the Extended ASCII range). + * Any other integer is interpreted as a string containing the decimal digits of the integer. + * + * @param mixed $int + * @param string $function + * + * @return mixed + */ + private static function convert_int_to_char_for_ctype($int, $function) + { + if (!\is_int($int)) { + return $int; + } + if ($int < -128 || $int > 255) { + return (string) $int; + } + if (\PHP_VERSION_ID >= 80100) { + @\trigger_error($function . '(): Argument of type int will be interpreted as string in the future', \E_USER_DEPRECATED); + } + if ($int < 0) { + $int += 256; + } + return \chr($int); + } +} diff --git a/vendor/symfony/polyfill-ctype/LICENSE b/vendor/symfony/polyfill-ctype/LICENSE new file mode 100644 index 00000000..7536caea --- /dev/null +++ b/vendor/symfony/polyfill-ctype/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-present Fabien Potencier + +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/symfony/polyfill-ctype/README.md b/vendor/symfony/polyfill-ctype/README.md new file mode 100644 index 00000000..b144d03c --- /dev/null +++ b/vendor/symfony/polyfill-ctype/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Ctype +======================== + +This component provides `ctype_*` functions to users who run php versions without the ctype extension. + +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-ctype/bootstrap.php b/vendor/symfony/polyfill-ctype/bootstrap.php new file mode 100644 index 00000000..4a8061cc --- /dev/null +++ b/vendor/symfony/polyfill-ctype/bootstrap.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use Symfony\Polyfill\Ctype as p; +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__ . '/bootstrap80.php'; +} +if (!\function_exists('ctype_alnum')) { + function ctype_alnum($text) + { + return p\Ctype::ctype_alnum($text); + } +} +if (!\function_exists('ctype_alpha')) { + function ctype_alpha($text) + { + return p\Ctype::ctype_alpha($text); + } +} +if (!\function_exists('ctype_cntrl')) { + function ctype_cntrl($text) + { + return p\Ctype::ctype_cntrl($text); + } +} +if (!\function_exists('ctype_digit')) { + function ctype_digit($text) + { + return p\Ctype::ctype_digit($text); + } +} +if (!\function_exists('ctype_graph')) { + function ctype_graph($text) + { + return p\Ctype::ctype_graph($text); + } +} +if (!\function_exists('ctype_lower')) { + function ctype_lower($text) + { + return p\Ctype::ctype_lower($text); + } +} +if (!\function_exists('ctype_print')) { + function ctype_print($text) + { + return p\Ctype::ctype_print($text); + } +} +if (!\function_exists('ctype_punct')) { + function ctype_punct($text) + { + return p\Ctype::ctype_punct($text); + } +} +if (!\function_exists('ctype_space')) { + function ctype_space($text) + { + return p\Ctype::ctype_space($text); + } +} +if (!\function_exists('ctype_upper')) { + function ctype_upper($text) + { + return p\Ctype::ctype_upper($text); + } +} +if (!\function_exists('ctype_xdigit')) { + function ctype_xdigit($text) + { + return p\Ctype::ctype_xdigit($text); + } +} diff --git a/vendor/symfony/polyfill-ctype/bootstrap80.php b/vendor/symfony/polyfill-ctype/bootstrap80.php new file mode 100644 index 00000000..908b03d6 --- /dev/null +++ b/vendor/symfony/polyfill-ctype/bootstrap80.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use Symfony\Polyfill\Ctype as p; +if (!\function_exists('ctype_alnum')) { + /** + * @param mixed $text + */ + function ctype_alnum($text) : bool + { + return p\Ctype::ctype_alnum($text); + } +} +if (!\function_exists('ctype_alpha')) { + /** + * @param mixed $text + */ + function ctype_alpha($text) : bool + { + return p\Ctype::ctype_alpha($text); + } +} +if (!\function_exists('ctype_cntrl')) { + /** + * @param mixed $text + */ + function ctype_cntrl($text) : bool + { + return p\Ctype::ctype_cntrl($text); + } +} +if (!\function_exists('ctype_digit')) { + /** + * @param mixed $text + */ + function ctype_digit($text) : bool + { + return p\Ctype::ctype_digit($text); + } +} +if (!\function_exists('ctype_graph')) { + /** + * @param mixed $text + */ + function ctype_graph($text) : bool + { + return p\Ctype::ctype_graph($text); + } +} +if (!\function_exists('ctype_lower')) { + /** + * @param mixed $text + */ + function ctype_lower($text) : bool + { + return p\Ctype::ctype_lower($text); + } +} +if (!\function_exists('ctype_print')) { + /** + * @param mixed $text + */ + function ctype_print($text) : bool + { + return p\Ctype::ctype_print($text); + } +} +if (!\function_exists('ctype_punct')) { + /** + * @param mixed $text + */ + function ctype_punct($text) : bool + { + return p\Ctype::ctype_punct($text); + } +} +if (!\function_exists('ctype_space')) { + /** + * @param mixed $text + */ + function ctype_space($text) : bool + { + return p\Ctype::ctype_space($text); + } +} +if (!\function_exists('ctype_upper')) { + /** + * @param mixed $text + */ + function ctype_upper($text) : bool + { + return p\Ctype::ctype_upper($text); + } +} +if (!\function_exists('ctype_xdigit')) { + /** + * @param mixed $text + */ + function ctype_xdigit($text) : bool + { + return p\Ctype::ctype_xdigit($text); + } +} diff --git a/vendor/symfony/polyfill-ctype/composer.json b/vendor/symfony/polyfill-ctype/composer.json new file mode 100644 index 00000000..aaee3668 --- /dev/null +++ b/vendor/symfony/polyfill-ctype/composer.json @@ -0,0 +1,47 @@ +{ + "name": "symfony\/polyfill-ctype", + "type": "library", + "description": "Symfony polyfill for ctype functions", + "keywords": [ + "polyfill", + "compatibility", + "portable", + "ctype" + ], + "homepage": "https:\/\/symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "thanks": { + "name": "symfony\/polyfill", + "url": "https:\/\/github.com\/symfony\/polyfill" + } + } +} \ No newline at end of file diff --git a/vendor/symfony/polyfill-intl-grapheme/Grapheme.php b/vendor/symfony/polyfill-intl-grapheme/Grapheme.php new file mode 100644 index 00000000..87f475a7 --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/Grapheme.php @@ -0,0 +1,210 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Symfony\Polyfill\Intl\Grapheme; + +\define('SYMFONY_GRAPHEME_CLUSTER_RX', ((float) \PCRE_VERSION < 10 ? (float) \PCRE_VERSION >= 8.32 : (float) \PCRE_VERSION >= 10.39) ? '\\X' : \Symfony\Polyfill\Intl\Grapheme\Grapheme::GRAPHEME_CLUSTER_RX); +/** + * Partial intl implementation in pure PHP. + * + * Implemented: + * - grapheme_extract - Extract a sequence of grapheme clusters from a text buffer, which must be encoded in UTF-8 + * - grapheme_stripos - Find position (in grapheme units) of first occurrence of a case-insensitive string + * - grapheme_stristr - Returns part of haystack string from the first occurrence of case-insensitive needle to the end of haystack + * - grapheme_strlen - Get string length in grapheme units + * - grapheme_strpos - Find position (in grapheme units) of first occurrence of a string + * - grapheme_strripos - Find position (in grapheme units) of last occurrence of a case-insensitive string + * - grapheme_strrpos - Find position (in grapheme units) of last occurrence of a string + * - grapheme_strstr - Returns part of haystack string from the first occurrence of needle to the end of haystack + * - grapheme_substr - Return part of a string + * + * @author Nicolas Grekas + * + * @internal + */ +final class Grapheme +{ + // (CRLF|([ZWNJ-ZWJ]|T+|L*(LV?V+|LV|LVT)T*|L+|[^Control])[Extend]*|[Control]) + // This regular expression is a work around for http://bugs.exim.org/1279 + public const GRAPHEME_CLUSTER_RX = '(?:\\r\\n|(?:[ -~\\x{200C}\\x{200D}]|[ᆨ-ᇹ]+|[ᄀ-ᅟ]*(?:[가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기까깨꺄꺠꺼께껴꼐꼬꽈꽤꾀꾜꾸꿔꿰뀌뀨끄끠끼나내냐냬너네녀녜노놔놰뇌뇨누눠눼뉘뉴느늬니다대댜댸더데뎌뎨도돠돼되됴두둬뒈뒤듀드듸디따때땨떄떠떼뗘뗴또똬뙈뙤뚀뚜뚸뛔뛰뜌뜨띄띠라래랴럐러레려례로롸뢔뢰료루뤄뤠뤼류르릐리마매먀먜머메며몌모뫄뫠뫼묘무뭐뭬뮈뮤므믜미바배뱌뱨버베벼볘보봐봬뵈뵤부붜붸뷔뷰브븨비빠빼뺘뺴뻐뻬뼈뼤뽀뽜뽸뾔뾰뿌뿨쀄쀠쀼쁘쁴삐사새샤섀서세셔셰소솨쇄쇠쇼수숴쉐쉬슈스싀시싸쌔쌰썌써쎄쎠쎼쏘쏴쐐쐬쑈쑤쒀쒜쒸쓔쓰씌씨아애야얘어에여예오와왜외요우워웨위유으의이자재쟈쟤저제져졔조좌좨죄죠주줘줴쥐쥬즈즤지짜째쨔쨰쩌쩨쪄쪠쪼쫘쫴쬐쬬쭈쭤쮀쮜쮸쯔쯰찌차채챠챼처체쳐쳬초촤쵀최쵸추춰췌취츄츠츼치카캐캬컈커케켜켸코콰쾌쾨쿄쿠쿼퀘퀴큐크킈키타태탸턔터테텨톄토톼퇘퇴툐투퉈퉤튀튜트틔티파패퍄퍠퍼페펴폐포퐈퐤푀표푸풔풰퓌퓨프픠피하해햐햬허헤혀혜호화홰회효후훠훼휘휴흐희히]?[ᅠ-ᆢ]+|[가-힣])[ᆨ-ᇹ]*|[ᄀ-ᅟ]+|[^\\p{Cc}\\p{Cf}\\p{Zl}\\p{Zp}])[\\p{Mn}\\p{Me}\\x{09BE}\\x{09D7}\\x{0B3E}\\x{0B57}\\x{0BBE}\\x{0BD7}\\x{0CC2}\\x{0CD5}\\x{0CD6}\\x{0D3E}\\x{0D57}\\x{0DCF}\\x{0DDF}\\x{200C}\\x{200D}\\x{1D165}\\x{1D16E}-\\x{1D172}]*|[\\p{Cc}\\p{Cf}\\p{Zl}\\p{Zp}])'; + private const CASE_FOLD = [['µ', 'ſ', "ͅ", 'ς', "ϐ", "ϑ", "ϕ", "ϖ", "ϰ", "ϱ", "ϵ", "ẛ", "ι"], ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "ṡ", 'ι']]; + public static function grapheme_extract($s, $size, $type = \GRAPHEME_EXTR_COUNT, $start = 0, &$next = 0) + { + if (0 > $start) { + $start = \strlen($s) + $start; + } + if (!\is_scalar($s)) { + $hasError = \false; + \set_error_handler(function () use(&$hasError) { + $hasError = \true; + }); + $next = \substr($s, $start); + \restore_error_handler(); + if ($hasError) { + \substr($s, $start); + $s = ''; + } else { + $s = $next; + } + } else { + $s = \substr($s, $start); + } + $size = (int) $size; + $type = (int) $type; + $start = (int) $start; + if (\GRAPHEME_EXTR_COUNT !== $type && \GRAPHEME_EXTR_MAXBYTES !== $type && \GRAPHEME_EXTR_MAXCHARS !== $type) { + if (80000 > \PHP_VERSION_ID) { + return \false; + } + throw new \ValueError('grapheme_extract(): Argument #3 ($type) must be one of GRAPHEME_EXTR_COUNT, GRAPHEME_EXTR_MAXBYTES, or GRAPHEME_EXTR_MAXCHARS'); + } + if (!isset($s[0]) || 0 > $size || 0 > $start) { + return \false; + } + if (0 === $size) { + return ''; + } + $next = $start; + $s = \preg_split('/(' . SYMFONY_GRAPHEME_CLUSTER_RX . ')/u', "\r\n" . $s, $size + 1, \PREG_SPLIT_NO_EMPTY | \PREG_SPLIT_DELIM_CAPTURE); + if (!isset($s[1])) { + return \false; + } + $i = 1; + $ret = ''; + do { + if (\GRAPHEME_EXTR_COUNT === $type) { + --$size; + } elseif (\GRAPHEME_EXTR_MAXBYTES === $type) { + $size -= \strlen($s[$i]); + } else { + $size -= \iconv_strlen($s[$i], 'UTF-8//IGNORE'); + } + if ($size >= 0) { + $ret .= $s[$i]; + } + } while (isset($s[++$i]) && $size > 0); + $next += \strlen($ret); + return $ret; + } + public static function grapheme_strlen($s) + { + \preg_replace('/' . SYMFONY_GRAPHEME_CLUSTER_RX . '/u', '', $s, -1, $len); + return 0 === $len && '' !== $s ? null : $len; + } + public static function grapheme_substr($s, $start, $len = null) + { + if (null === $len) { + $len = 2147483647; + } + \preg_match_all('/' . SYMFONY_GRAPHEME_CLUSTER_RX . '/u', $s, $s); + $slen = \count($s[0]); + $start = (int) $start; + if (0 > $start) { + $start += $slen; + } + if (0 > $start) { + if (\PHP_VERSION_ID < 80000) { + return \false; + } + $start = 0; + } + if ($start >= $slen) { + return \PHP_VERSION_ID >= 80000 ? '' : \false; + } + $rem = $slen - $start; + if (0 > $len) { + $len += $rem; + } + if (0 === $len) { + return ''; + } + if (0 > $len) { + return \PHP_VERSION_ID >= 80000 ? '' : \false; + } + if ($len > $rem) { + $len = $rem; + } + return \implode('', \array_slice($s[0], $start, $len)); + } + public static function grapheme_strpos($s, $needle, $offset = 0) + { + return self::grapheme_position($s, $needle, $offset, 0); + } + public static function grapheme_stripos($s, $needle, $offset = 0) + { + return self::grapheme_position($s, $needle, $offset, 1); + } + public static function grapheme_strrpos($s, $needle, $offset = 0) + { + return self::grapheme_position($s, $needle, $offset, 2); + } + public static function grapheme_strripos($s, $needle, $offset = 0) + { + return self::grapheme_position($s, $needle, $offset, 3); + } + public static function grapheme_stristr($s, $needle, $beforeNeedle = \false) + { + return \mb_stristr($s, $needle, $beforeNeedle, 'UTF-8'); + } + public static function grapheme_strstr($s, $needle, $beforeNeedle = \false) + { + return \mb_strstr($s, $needle, $beforeNeedle, 'UTF-8'); + } + private static function grapheme_position($s, $needle, $offset, $mode) + { + $needle = (string) $needle; + if (80000 > \PHP_VERSION_ID && !\preg_match('/./us', $needle)) { + return \false; + } + $s = (string) $s; + if (!\preg_match('/./us', $s)) { + return \false; + } + if ($offset > 0) { + $s = self::grapheme_substr($s, $offset); + } elseif ($offset < 0) { + if (2 > $mode) { + $offset += self::grapheme_strlen($s); + $s = self::grapheme_substr($s, $offset); + if (0 > $offset) { + $offset = 0; + } + } elseif (0 > ($offset += self::grapheme_strlen($needle))) { + $s = self::grapheme_substr($s, 0, $offset); + $offset = 0; + } else { + $offset = 0; + } + } + // As UTF-8 is self-synchronizing, and we have ensured the strings are valid UTF-8, + // we can use normal binary string functions here. For case-insensitive searches, + // case fold the strings first. + $caseInsensitive = $mode & 1; + $reverse = $mode & 2; + if ($caseInsensitive) { + // Use the same case folding mode as mbstring does for mb_stripos(). + // Stick to SIMPLE case folding to avoid changing the length of the string, which + // might result in offsets being shifted. + $mode = \defined('MB_CASE_FOLD_SIMPLE') ? \MB_CASE_FOLD_SIMPLE : \MB_CASE_LOWER; + $s = \mb_convert_case($s, $mode, 'UTF-8'); + $needle = \mb_convert_case($needle, $mode, 'UTF-8'); + if (!\defined('MB_CASE_FOLD_SIMPLE')) { + $s = \str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s); + $needle = \str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $needle); + } + } + if ($reverse) { + $needlePos = \strrpos($s, $needle); + } else { + $needlePos = \strpos($s, $needle); + } + return \false !== $needlePos ? self::grapheme_strlen(\substr($s, 0, $needlePos)) + $offset : \false; + } +} diff --git a/vendor/symfony/polyfill-intl-grapheme/LICENSE b/vendor/symfony/polyfill-intl-grapheme/LICENSE new file mode 100644 index 00000000..6e3afce6 --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-present Fabien Potencier + +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/symfony/polyfill-intl-grapheme/README.md b/vendor/symfony/polyfill-intl-grapheme/README.md new file mode 100644 index 00000000..f55d92c5 --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/README.md @@ -0,0 +1,31 @@ +Symfony Polyfill / Intl: Grapheme +================================= + +This component provides a partial, native PHP implementation of the +[Grapheme functions](https://php.net/intl.grapheme) from the +[Intl](https://php.net/intl) extension. + +- [`grapheme_extract`](https://php.net/grapheme_extract): Extract a sequence of grapheme + clusters from a text buffer, which must be encoded in UTF-8 +- [`grapheme_stripos`](https://php.net/grapheme_stripos): Find position (in grapheme units) + of first occurrence of a case-insensitive string +- [`grapheme_stristr`](https://php.net/grapheme_stristr): Returns part of haystack string + from the first occurrence of case-insensitive needle to the end of haystack +- [`grapheme_strlen`](https://php.net/grapheme_strlen): Get string length in grapheme units +- [`grapheme_strpos`](https://php.net/grapheme_strpos): Find position (in grapheme units) + of first occurrence of a string +- [`grapheme_strripos`](https://php.net/grapheme_strripos): Find position (in grapheme units) + of last occurrence of a case-insensitive string +- [`grapheme_strrpos`](https://php.net/grapheme_strrpos): Find position (in grapheme units) + of last occurrence of a string +- [`grapheme_strstr`](https://php.net/grapheme_strstr): Returns part of haystack string from + the first occurrence of needle to the end of haystack +- [`grapheme_substr`](https://php.net/grapheme_substr): Return part of a string + +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-intl-grapheme/bootstrap.php b/vendor/symfony/polyfill-intl-grapheme/bootstrap.php new file mode 100644 index 00000000..f7728092 --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/bootstrap.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use Symfony\Polyfill\Intl\Grapheme as p; +if (\extension_loaded('intl')) { + return; +} +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__ . '/bootstrap80.php'; +} +if (!\defined('GRAPHEME_EXTR_COUNT')) { + \define('GRAPHEME_EXTR_COUNT', 0); +} +if (!\defined('GRAPHEME_EXTR_MAXBYTES')) { + \define('GRAPHEME_EXTR_MAXBYTES', 1); +} +if (!\defined('GRAPHEME_EXTR_MAXCHARS')) { + \define('GRAPHEME_EXTR_MAXCHARS', 2); +} +if (!\function_exists('grapheme_extract')) { + function grapheme_extract($haystack, $size, $type = 0, $start = 0, &$next = 0) + { + return p\Grapheme::grapheme_extract($haystack, $size, $type, $start, $next); + } +} +if (!\function_exists('grapheme_stripos')) { + function grapheme_stripos($haystack, $needle, $offset = 0) + { + return p\Grapheme::grapheme_stripos($haystack, $needle, $offset); + } +} +if (!\function_exists('grapheme_stristr')) { + function grapheme_stristr($haystack, $needle, $beforeNeedle = \false) + { + return p\Grapheme::grapheme_stristr($haystack, $needle, $beforeNeedle); + } +} +if (!\function_exists('grapheme_strlen')) { + function grapheme_strlen($input) + { + return p\Grapheme::grapheme_strlen($input); + } +} +if (!\function_exists('grapheme_strpos')) { + function grapheme_strpos($haystack, $needle, $offset = 0) + { + return p\Grapheme::grapheme_strpos($haystack, $needle, $offset); + } +} +if (!\function_exists('grapheme_strripos')) { + function grapheme_strripos($haystack, $needle, $offset = 0) + { + return p\Grapheme::grapheme_strripos($haystack, $needle, $offset); + } +} +if (!\function_exists('grapheme_strrpos')) { + function grapheme_strrpos($haystack, $needle, $offset = 0) + { + return p\Grapheme::grapheme_strrpos($haystack, $needle, $offset); + } +} +if (!\function_exists('grapheme_strstr')) { + function grapheme_strstr($haystack, $needle, $beforeNeedle = \false) + { + return p\Grapheme::grapheme_strstr($haystack, $needle, $beforeNeedle); + } +} +if (!\function_exists('grapheme_substr')) { + function grapheme_substr($string, $offset, $length = null) + { + return p\Grapheme::grapheme_substr($string, $offset, $length); + } +} diff --git a/vendor/symfony/polyfill-intl-grapheme/bootstrap80.php b/vendor/symfony/polyfill-intl-grapheme/bootstrap80.php new file mode 100644 index 00000000..4e299843 --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/bootstrap80.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use Symfony\Polyfill\Intl\Grapheme as p; +if (!\defined('GRAPHEME_EXTR_COUNT')) { + \define('GRAPHEME_EXTR_COUNT', 0); +} +if (!\defined('GRAPHEME_EXTR_MAXBYTES')) { + \define('GRAPHEME_EXTR_MAXBYTES', 1); +} +if (!\defined('GRAPHEME_EXTR_MAXCHARS')) { + \define('GRAPHEME_EXTR_MAXCHARS', 2); +} +if (!\function_exists('grapheme_extract')) { + /** + * @return string|false + */ + function grapheme_extract(?string $haystack, ?int $size, ?int $type = \GRAPHEME_EXTR_COUNT, ?int $offset = 0, &$next = null) + { + return p\Grapheme::grapheme_extract((string) $haystack, (int) $size, (int) $type, (int) $offset, $next); + } +} +if (!\function_exists('grapheme_stripos')) { + /** + * @return int|false + */ + function grapheme_stripos(?string $haystack, ?string $needle, ?int $offset = 0) + { + return p\Grapheme::grapheme_stripos((string) $haystack, (string) $needle, (int) $offset); + } +} +if (!\function_exists('grapheme_stristr')) { + /** + * @return string|false + */ + function grapheme_stristr(?string $haystack, ?string $needle, ?bool $beforeNeedle = \false) + { + return p\Grapheme::grapheme_stristr((string) $haystack, (string) $needle, (bool) $beforeNeedle); + } +} +if (!\function_exists('grapheme_strlen')) { + /** + * @return int|false|null + */ + function grapheme_strlen(?string $string) + { + return p\Grapheme::grapheme_strlen((string) $string); + } +} +if (!\function_exists('grapheme_strpos')) { + /** + * @return int|false + */ + function grapheme_strpos(?string $haystack, ?string $needle, ?int $offset = 0) + { + return p\Grapheme::grapheme_strpos((string) $haystack, (string) $needle, (int) $offset); + } +} +if (!\function_exists('grapheme_strripos')) { + /** + * @return int|false + */ + function grapheme_strripos(?string $haystack, ?string $needle, ?int $offset = 0) + { + return p\Grapheme::grapheme_strripos((string) $haystack, (string) $needle, (int) $offset); + } +} +if (!\function_exists('grapheme_strrpos')) { + /** + * @return int|false + */ + function grapheme_strrpos(?string $haystack, ?string $needle, ?int $offset = 0) + { + return p\Grapheme::grapheme_strrpos((string) $haystack, (string) $needle, (int) $offset); + } +} +if (!\function_exists('grapheme_strstr')) { + /** + * @return string|false + */ + function grapheme_strstr(?string $haystack, ?string $needle, ?bool $beforeNeedle = \false) + { + return p\Grapheme::grapheme_strstr((string) $haystack, (string) $needle, (bool) $beforeNeedle); + } +} +if (!\function_exists('grapheme_substr')) { + /** + * @return string|false + */ + function grapheme_substr(?string $string, ?int $offset, ?int $length = null) + { + return p\Grapheme::grapheme_substr((string) $string, (int) $offset, $length); + } +} diff --git a/vendor/symfony/polyfill-intl-grapheme/composer.json b/vendor/symfony/polyfill-intl-grapheme/composer.json new file mode 100644 index 00000000..c2fca99a --- /dev/null +++ b/vendor/symfony/polyfill-intl-grapheme/composer.json @@ -0,0 +1,46 @@ +{ + "name": "symfony\/polyfill-intl-grapheme", + "type": "library", + "description": "Symfony polyfill for intl's grapheme_* functions", + "keywords": [ + "polyfill", + "shim", + "compatibility", + "portable", + "intl", + "grapheme" + ], + "homepage": "https:\/\/symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "suggest": { + "ext-intl": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "thanks": { + "name": "symfony\/polyfill", + "url": "https:\/\/github.com\/symfony\/polyfill" + } + } +} \ No newline at end of file diff --git a/vendor/symfony/polyfill-intl-normalizer/LICENSE b/vendor/symfony/polyfill-intl-normalizer/LICENSE new file mode 100644 index 00000000..6e3afce6 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-present Fabien Potencier + +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/symfony/polyfill-intl-normalizer/Normalizer.php b/vendor/symfony/polyfill-intl-normalizer/Normalizer.php new file mode 100644 index 00000000..8ec3ed0e --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Normalizer.php @@ -0,0 +1,258 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Symfony\Polyfill\Intl\Normalizer; + +/** + * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension. + * + * It has been validated with Unicode 6.3 Normalization Conformance Test. + * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations. + * + * @author Nicolas Grekas + * + * @internal + */ +class Normalizer +{ + public const FORM_D = \Normalizer::FORM_D; + public const FORM_KD = \Normalizer::FORM_KD; + public const FORM_C = \Normalizer::FORM_C; + public const FORM_KC = \Normalizer::FORM_KC; + public const NFD = \Normalizer::NFD; + public const NFKD = \Normalizer::NFKD; + public const NFC = \Normalizer::NFC; + public const NFKC = \Normalizer::NFKC; + private static $C; + private static $D; + private static $KD; + private static $cC; + private static $ulenMask = ["\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4]; + private static $ASCII = " eiasntrolud][cmp'\ng|hv.fb,:=-q10C2*yx)(L9AS/P\"EjMIk3>5T \PHP_VERSION_ID) { + return \false; + } + throw new \ValueError('normalizer_normalize(): Argument #2 ($form) must be a a valid normalization form'); + } + if ('' === $s) { + return ''; + } + if ($K && null === self::$KD) { + self::$KD = self::getData('compatibilityDecomposition'); + } + if (null === self::$D) { + self::$D = self::getData('canonicalDecomposition'); + self::$cC = self::getData('combiningClass'); + } + if (null !== ($mbEncoding = 2 & (int) \ini_get('mbstring.func_overload') ? \mb_internal_encoding() : null)) { + \mb_internal_encoding('8bit'); + } + $r = self::decompose($s, $K); + if ($C) { + if (null === self::$C) { + self::$C = self::getData('canonicalComposition'); + } + $r = self::recompose($r); + } + if (null !== $mbEncoding) { + \mb_internal_encoding($mbEncoding); + } + return $r; + } + private static function recompose($s) + { + $ASCII = self::$ASCII; + $compMap = self::$C; + $combClass = self::$cC; + $ulenMask = self::$ulenMask; + $result = $tail = ''; + $i = $s[0] < "\x80" ? 1 : $ulenMask[$s[0] & "\xf0"]; + $len = \strlen($s); + $lastUchr = \substr($s, 0, $i); + $lastUcls = isset($combClass[$lastUchr]) ? 256 : 0; + while ($i < $len) { + if ($s[$i] < "\x80") { + // ASCII chars + if ($tail) { + $lastUchr .= $tail; + $tail = ''; + } + if ($j = \strspn($s, $ASCII, $i + 1)) { + $lastUchr .= \substr($s, $i, $j); + $i += $j; + } + $result .= $lastUchr; + $lastUchr = $s[$i]; + $lastUcls = 0; + ++$i; + continue; + } + $ulen = $ulenMask[$s[$i] & "\xf0"]; + $uchr = \substr($s, $i, $ulen); + if ($lastUchr < "ᄀ" || "ᄒ" < $lastUchr || $uchr < "ᅡ" || "ᅵ" < $uchr || $lastUcls) { + // Table lookup and combining chars composition + $ucls = $combClass[$uchr] ?? 0; + if (isset($compMap[$lastUchr . $uchr]) && (!$lastUcls || $lastUcls < $ucls)) { + $lastUchr = $compMap[$lastUchr . $uchr]; + } elseif ($lastUcls = $ucls) { + $tail .= $uchr; + } else { + if ($tail) { + $lastUchr .= $tail; + $tail = ''; + } + $result .= $lastUchr; + $lastUchr = $uchr; + } + } else { + // Hangul chars + $L = \ord($lastUchr[2]) - 0x80; + $V = \ord($uchr[2]) - 0xa1; + $T = 0; + $uchr = \substr($s, $i + $ulen, 3); + if ("ᆧ" <= $uchr && $uchr <= "ᇂ") { + $T = \ord($uchr[2]) - 0xa7; + 0 > $T && ($T += 0x40); + $ulen += 3; + } + $L = 0xac00 + ($L * 21 + $V) * 28 + $T; + $lastUchr = \chr(0xe0 | $L >> 12) . \chr(0x80 | $L >> 6 & 0x3f) . \chr(0x80 | $L & 0x3f); + } + $i += $ulen; + } + return $result . $lastUchr . $tail; + } + private static function decompose($s, $c) + { + $result = ''; + $ASCII = self::$ASCII; + $decompMap = self::$D; + $combClass = self::$cC; + $ulenMask = self::$ulenMask; + if ($c) { + $compatMap = self::$KD; + } + $c = []; + $i = 0; + $len = \strlen($s); + while ($i < $len) { + if ($s[$i] < "\x80") { + // ASCII chars + if ($c) { + \ksort($c); + $result .= \implode('', $c); + $c = []; + } + $j = 1 + \strspn($s, $ASCII, $i + 1); + $result .= \substr($s, $i, $j); + $i += $j; + continue; + } + $ulen = $ulenMask[$s[$i] & "\xf0"]; + $uchr = \substr($s, $i, $ulen); + $i += $ulen; + if ($uchr < "가" || "힣" < $uchr) { + // Table lookup + if ($uchr !== ($j = $compatMap[$uchr] ?? $decompMap[$uchr] ?? $uchr)) { + $uchr = $j; + $j = \strlen($uchr); + $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xf0"]; + if ($ulen != $j) { + // Put trailing chars in $s + $j -= $ulen; + $i -= $j; + if (0 > $i) { + $s = \str_repeat(' ', -$i) . $s; + $len -= $i; + $i = 0; + } + while ($j--) { + $s[$i + $j] = $uchr[$ulen + $j]; + } + $uchr = \substr($uchr, 0, $ulen); + } + } + if (isset($combClass[$uchr])) { + // Combining chars, for sorting + if (!isset($c[$combClass[$uchr]])) { + $c[$combClass[$uchr]] = ''; + } + $c[$combClass[$uchr]] .= $uchr; + continue; + } + } else { + // Hangul chars + $uchr = \unpack('C*', $uchr); + $j = ($uchr[1] - 224 << 12) + ($uchr[2] - 128 << 6) + $uchr[3] - 0xac80; + $uchr = "\xe1\x84" . \chr(0x80 + (int) ($j / 588)) . "\xe1\x85" . \chr(0xa1 + (int) ($j % 588 / 28)); + if ($j %= 28) { + $uchr .= $j < 25 ? "\xe1\x86" . \chr(0xa7 + $j) : "\xe1\x87" . \chr(0x67 + $j); + } + } + if ($c) { + \ksort($c); + $result .= \implode('', $c); + $c = []; + } + $result .= $uchr; + } + if ($c) { + \ksort($c); + $result .= \implode('', $c); + } + return $result; + } + private static function getData($file) + { + if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) { + return require $file; + } + return \false; + } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/README.md b/vendor/symfony/polyfill-intl-normalizer/README.md new file mode 100644 index 00000000..b9b762e8 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/README.md @@ -0,0 +1,14 @@ +Symfony Polyfill / Intl: Normalizer +=================================== + +This component provides a fallback implementation for the +[`Normalizer`](https://php.net/Normalizer) class provided +by the [Intl](https://php.net/intl) extension. + +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-intl-normalizer/Resources/stubs/Normalizer.php b/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php new file mode 100644 index 00000000..20cdb38c --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php @@ -0,0 +1,20 @@ + 'À', 'Á' => 'Á', 'Â' => 'Â', 'Ã' => 'Ã', 'Ä' => 'Ä', 'Å' => 'Å', 'Ç' => 'Ç', 'È' => 'È', 'É' => 'É', 'Ê' => 'Ê', 'Ë' => 'Ë', 'Ì' => 'Ì', 'Í' => 'Í', 'Î' => 'Î', 'Ï' => 'Ï', 'Ñ' => 'Ñ', 'Ò' => 'Ò', 'Ó' => 'Ó', 'Ô' => 'Ô', 'Õ' => 'Õ', 'Ö' => 'Ö', 'Ù' => 'Ù', 'Ú' => 'Ú', 'Û' => 'Û', 'Ü' => 'Ü', 'Ý' => 'Ý', 'à' => 'à', 'á' => 'á', 'â' => 'â', 'ã' => 'ã', 'ä' => 'ä', 'å' => 'å', 'ç' => 'ç', 'è' => 'è', 'é' => 'é', 'ê' => 'ê', 'ë' => 'ë', 'ì' => 'ì', 'í' => 'í', 'î' => 'î', 'ï' => 'ï', 'ñ' => 'ñ', 'ò' => 'ò', 'ó' => 'ó', 'ô' => 'ô', 'õ' => 'õ', 'ö' => 'ö', 'ù' => 'ù', 'ú' => 'ú', 'û' => 'û', 'ü' => 'ü', 'ý' => 'ý', 'ÿ' => 'ÿ', 'Ā' => 'Ā', 'ā' => 'ā', 'Ă' => 'Ă', 'ă' => 'ă', 'Ą' => 'Ą', 'ą' => 'ą', 'Ć' => 'Ć', 'ć' => 'ć', 'Ĉ' => 'Ĉ', 'ĉ' => 'ĉ', 'Ċ' => 'Ċ', 'ċ' => 'ċ', 'Č' => 'Č', 'č' => 'č', 'Ď' => 'Ď', 'ď' => 'ď', 'Ē' => 'Ē', 'ē' => 'ē', 'Ĕ' => 'Ĕ', 'ĕ' => 'ĕ', 'Ė' => 'Ė', 'ė' => 'ė', 'Ę' => 'Ę', 'ę' => 'ę', 'Ě' => 'Ě', 'ě' => 'ě', 'Ĝ' => 'Ĝ', 'ĝ' => 'ĝ', 'Ğ' => 'Ğ', 'ğ' => 'ğ', 'Ġ' => 'Ġ', 'ġ' => 'ġ', 'Ģ' => 'Ģ', 'ģ' => 'ģ', 'Ĥ' => 'Ĥ', 'ĥ' => 'ĥ', 'Ĩ' => 'Ĩ', 'ĩ' => 'ĩ', 'Ī' => 'Ī', 'ī' => 'ī', 'Ĭ' => 'Ĭ', 'ĭ' => 'ĭ', 'Į' => 'Į', 'į' => 'į', 'İ' => 'İ', 'Ĵ' => 'Ĵ', 'ĵ' => 'ĵ', 'Ķ' => 'Ķ', 'ķ' => 'ķ', 'Ĺ' => 'Ĺ', 'ĺ' => 'ĺ', 'Ļ' => 'Ļ', 'ļ' => 'ļ', 'Ľ' => 'Ľ', 'ľ' => 'ľ', 'Ń' => 'Ń', 'ń' => 'ń', 'Ņ' => 'Ņ', 'ņ' => 'ņ', 'Ň' => 'Ň', 'ň' => 'ň', 'Ō' => 'Ō', 'ō' => 'ō', 'Ŏ' => 'Ŏ', 'ŏ' => 'ŏ', 'Ő' => 'Ő', 'ő' => 'ő', 'Ŕ' => 'Ŕ', 'ŕ' => 'ŕ', 'Ŗ' => 'Ŗ', 'ŗ' => 'ŗ', 'Ř' => 'Ř', 'ř' => 'ř', 'Ś' => 'Ś', 'ś' => 'ś', 'Ŝ' => 'Ŝ', 'ŝ' => 'ŝ', 'Ş' => 'Ş', 'ş' => 'ş', 'Š' => 'Š', 'š' => 'š', 'Ţ' => 'Ţ', 'ţ' => 'ţ', 'Ť' => 'Ť', 'ť' => 'ť', 'Ũ' => 'Ũ', 'ũ' => 'ũ', 'Ū' => 'Ū', 'ū' => 'ū', 'Ŭ' => 'Ŭ', 'ŭ' => 'ŭ', 'Ů' => 'Ů', 'ů' => 'ů', 'Ű' => 'Ű', 'ű' => 'ű', 'Ų' => 'Ų', 'ų' => 'ų', 'Ŵ' => 'Ŵ', 'ŵ' => 'ŵ', 'Ŷ' => 'Ŷ', 'ŷ' => 'ŷ', 'Ÿ' => 'Ÿ', 'Ź' => 'Ź', 'ź' => 'ź', 'Ż' => 'Ż', 'ż' => 'ż', 'Ž' => 'Ž', 'ž' => 'ž', 'Ơ' => 'Ơ', 'ơ' => 'ơ', 'Ư' => 'Ư', 'ư' => 'ư', 'Ǎ' => 'Ǎ', 'ǎ' => 'ǎ', 'Ǐ' => 'Ǐ', 'ǐ' => 'ǐ', 'Ǒ' => 'Ǒ', 'ǒ' => 'ǒ', 'Ǔ' => 'Ǔ', 'ǔ' => 'ǔ', 'Ǖ' => 'Ǖ', 'ǖ' => 'ǖ', 'Ǘ' => 'Ǘ', 'ǘ' => 'ǘ', 'Ǚ' => 'Ǚ', 'ǚ' => 'ǚ', 'Ǜ' => 'Ǜ', 'ǜ' => 'ǜ', 'Ǟ' => 'Ǟ', 'ǟ' => 'ǟ', 'Ǡ' => 'Ǡ', 'ǡ' => 'ǡ', 'Ǣ' => 'Ǣ', 'ǣ' => 'ǣ', 'Ǧ' => 'Ǧ', 'ǧ' => 'ǧ', 'Ǩ' => 'Ǩ', 'ǩ' => 'ǩ', 'Ǫ' => 'Ǫ', 'ǫ' => 'ǫ', 'Ǭ' => 'Ǭ', 'ǭ' => 'ǭ', 'Ǯ' => 'Ǯ', 'ǯ' => 'ǯ', 'ǰ' => 'ǰ', 'Ǵ' => 'Ǵ', 'ǵ' => 'ǵ', 'Ǹ' => 'Ǹ', 'ǹ' => 'ǹ', 'Ǻ' => 'Ǻ', 'ǻ' => 'ǻ', 'Ǽ' => 'Ǽ', 'ǽ' => 'ǽ', 'Ǿ' => 'Ǿ', 'ǿ' => 'ǿ', 'Ȁ' => 'Ȁ', 'ȁ' => 'ȁ', 'Ȃ' => 'Ȃ', 'ȃ' => 'ȃ', 'Ȅ' => 'Ȅ', 'ȅ' => 'ȅ', 'Ȇ' => 'Ȇ', 'ȇ' => 'ȇ', 'Ȉ' => 'Ȉ', 'ȉ' => 'ȉ', 'Ȋ' => 'Ȋ', 'ȋ' => 'ȋ', 'Ȍ' => 'Ȍ', 'ȍ' => 'ȍ', 'Ȏ' => 'Ȏ', 'ȏ' => 'ȏ', 'Ȑ' => 'Ȑ', 'ȑ' => 'ȑ', 'Ȓ' => 'Ȓ', 'ȓ' => 'ȓ', 'Ȕ' => 'Ȕ', 'ȕ' => 'ȕ', 'Ȗ' => 'Ȗ', 'ȗ' => 'ȗ', 'Ș' => 'Ș', 'ș' => 'ș', 'Ț' => 'Ț', 'ț' => 'ț', 'Ȟ' => 'Ȟ', 'ȟ' => 'ȟ', 'Ȧ' => 'Ȧ', 'ȧ' => 'ȧ', 'Ȩ' => 'Ȩ', 'ȩ' => 'ȩ', 'Ȫ' => 'Ȫ', 'ȫ' => 'ȫ', 'Ȭ' => 'Ȭ', 'ȭ' => 'ȭ', 'Ȯ' => 'Ȯ', 'ȯ' => 'ȯ', 'Ȱ' => 'Ȱ', 'ȱ' => 'ȱ', 'Ȳ' => 'Ȳ', 'ȳ' => 'ȳ', '΅' => '΅', 'Ά' => 'Ά', 'Έ' => 'Έ', 'Ή' => 'Ή', 'Ί' => 'Ί', 'Ό' => 'Ό', 'Ύ' => 'Ύ', 'Ώ' => 'Ώ', 'ΐ' => 'ΐ', 'Ϊ' => 'Ϊ', 'Ϋ' => 'Ϋ', 'ά' => 'ά', 'έ' => 'έ', 'ή' => 'ή', 'ί' => 'ί', 'ΰ' => 'ΰ', 'ϊ' => 'ϊ', 'ϋ' => 'ϋ', 'ό' => 'ό', 'ύ' => 'ύ', 'ώ' => 'ώ', 'ϓ' => 'ϓ', 'ϔ' => 'ϔ', 'Ѐ' => 'Ѐ', 'Ё' => 'Ё', 'Ѓ' => 'Ѓ', 'Ї' => 'Ї', 'Ќ' => 'Ќ', 'Ѝ' => 'Ѝ', 'Ў' => 'Ў', 'Й' => 'Й', 'й' => 'й', 'ѐ' => 'ѐ', 'ё' => 'ё', 'ѓ' => 'ѓ', 'ї' => 'ї', 'ќ' => 'ќ', 'ѝ' => 'ѝ', 'ў' => 'ў', 'Ѷ' => 'Ѷ', 'ѷ' => 'ѷ', 'Ӂ' => 'Ӂ', 'ӂ' => 'ӂ', 'Ӑ' => 'Ӑ', 'ӑ' => 'ӑ', 'Ӓ' => 'Ӓ', 'ӓ' => 'ӓ', 'Ӗ' => 'Ӗ', 'ӗ' => 'ӗ', 'Ӛ' => 'Ӛ', 'ӛ' => 'ӛ', 'Ӝ' => 'Ӝ', 'ӝ' => 'ӝ', 'Ӟ' => 'Ӟ', 'ӟ' => 'ӟ', 'Ӣ' => 'Ӣ', 'ӣ' => 'ӣ', 'Ӥ' => 'Ӥ', 'ӥ' => 'ӥ', 'Ӧ' => 'Ӧ', 'ӧ' => 'ӧ', 'Ӫ' => 'Ӫ', 'ӫ' => 'ӫ', 'Ӭ' => 'Ӭ', 'ӭ' => 'ӭ', 'Ӯ' => 'Ӯ', 'ӯ' => 'ӯ', 'Ӱ' => 'Ӱ', 'ӱ' => 'ӱ', 'Ӳ' => 'Ӳ', 'ӳ' => 'ӳ', 'Ӵ' => 'Ӵ', 'ӵ' => 'ӵ', 'Ӹ' => 'Ӹ', 'ӹ' => 'ӹ', 'آ' => 'آ', 'أ' => 'أ', 'ؤ' => 'ؤ', 'إ' => 'إ', 'ئ' => 'ئ', 'ۀ' => 'ۀ', 'ۂ' => 'ۂ', 'ۓ' => 'ۓ', 'ऩ' => 'ऩ', 'ऱ' => 'ऱ', 'ऴ' => 'ऴ', 'ো' => 'ো', 'ৌ' => 'ৌ', 'ୈ' => 'ୈ', 'ୋ' => 'ୋ', 'ୌ' => 'ୌ', 'ஔ' => 'ஔ', 'ொ' => 'ொ', 'ோ' => 'ோ', 'ௌ' => 'ௌ', 'ై' => 'ై', 'ೀ' => 'ೀ', 'ೇ' => 'ೇ', 'ೈ' => 'ೈ', 'ೊ' => 'ೊ', 'ೋ' => 'ೋ', 'ൊ' => 'ൊ', 'ോ' => 'ോ', 'ൌ' => 'ൌ', 'ේ' => 'ේ', 'ො' => 'ො', 'ෝ' => 'ෝ', 'ෞ' => 'ෞ', 'ဦ' => 'ဦ', 'ᬆ' => 'ᬆ', 'ᬈ' => 'ᬈ', 'ᬊ' => 'ᬊ', 'ᬌ' => 'ᬌ', 'ᬎ' => 'ᬎ', 'ᬒ' => 'ᬒ', 'ᬻ' => 'ᬻ', 'ᬽ' => 'ᬽ', 'ᭀ' => 'ᭀ', 'ᭁ' => 'ᭁ', 'ᭃ' => 'ᭃ', 'Ḁ' => 'Ḁ', 'ḁ' => 'ḁ', 'Ḃ' => 'Ḃ', 'ḃ' => 'ḃ', 'Ḅ' => 'Ḅ', 'ḅ' => 'ḅ', 'Ḇ' => 'Ḇ', 'ḇ' => 'ḇ', 'Ḉ' => 'Ḉ', 'ḉ' => 'ḉ', 'Ḋ' => 'Ḋ', 'ḋ' => 'ḋ', 'Ḍ' => 'Ḍ', 'ḍ' => 'ḍ', 'Ḏ' => 'Ḏ', 'ḏ' => 'ḏ', 'Ḑ' => 'Ḑ', 'ḑ' => 'ḑ', 'Ḓ' => 'Ḓ', 'ḓ' => 'ḓ', 'Ḕ' => 'Ḕ', 'ḕ' => 'ḕ', 'Ḗ' => 'Ḗ', 'ḗ' => 'ḗ', 'Ḙ' => 'Ḙ', 'ḙ' => 'ḙ', 'Ḛ' => 'Ḛ', 'ḛ' => 'ḛ', 'Ḝ' => 'Ḝ', 'ḝ' => 'ḝ', 'Ḟ' => 'Ḟ', 'ḟ' => 'ḟ', 'Ḡ' => 'Ḡ', 'ḡ' => 'ḡ', 'Ḣ' => 'Ḣ', 'ḣ' => 'ḣ', 'Ḥ' => 'Ḥ', 'ḥ' => 'ḥ', 'Ḧ' => 'Ḧ', 'ḧ' => 'ḧ', 'Ḩ' => 'Ḩ', 'ḩ' => 'ḩ', 'Ḫ' => 'Ḫ', 'ḫ' => 'ḫ', 'Ḭ' => 'Ḭ', 'ḭ' => 'ḭ', 'Ḯ' => 'Ḯ', 'ḯ' => 'ḯ', 'Ḱ' => 'Ḱ', 'ḱ' => 'ḱ', 'Ḳ' => 'Ḳ', 'ḳ' => 'ḳ', 'Ḵ' => 'Ḵ', 'ḵ' => 'ḵ', 'Ḷ' => 'Ḷ', 'ḷ' => 'ḷ', 'Ḹ' => 'Ḹ', 'ḹ' => 'ḹ', 'Ḻ' => 'Ḻ', 'ḻ' => 'ḻ', 'Ḽ' => 'Ḽ', 'ḽ' => 'ḽ', 'Ḿ' => 'Ḿ', 'ḿ' => 'ḿ', 'Ṁ' => 'Ṁ', 'ṁ' => 'ṁ', 'Ṃ' => 'Ṃ', 'ṃ' => 'ṃ', 'Ṅ' => 'Ṅ', 'ṅ' => 'ṅ', 'Ṇ' => 'Ṇ', 'ṇ' => 'ṇ', 'Ṉ' => 'Ṉ', 'ṉ' => 'ṉ', 'Ṋ' => 'Ṋ', 'ṋ' => 'ṋ', 'Ṍ' => 'Ṍ', 'ṍ' => 'ṍ', 'Ṏ' => 'Ṏ', 'ṏ' => 'ṏ', 'Ṑ' => 'Ṑ', 'ṑ' => 'ṑ', 'Ṓ' => 'Ṓ', 'ṓ' => 'ṓ', 'Ṕ' => 'Ṕ', 'ṕ' => 'ṕ', 'Ṗ' => 'Ṗ', 'ṗ' => 'ṗ', 'Ṙ' => 'Ṙ', 'ṙ' => 'ṙ', 'Ṛ' => 'Ṛ', 'ṛ' => 'ṛ', 'Ṝ' => 'Ṝ', 'ṝ' => 'ṝ', 'Ṟ' => 'Ṟ', 'ṟ' => 'ṟ', 'Ṡ' => 'Ṡ', 'ṡ' => 'ṡ', 'Ṣ' => 'Ṣ', 'ṣ' => 'ṣ', 'Ṥ' => 'Ṥ', 'ṥ' => 'ṥ', 'Ṧ' => 'Ṧ', 'ṧ' => 'ṧ', 'Ṩ' => 'Ṩ', 'ṩ' => 'ṩ', 'Ṫ' => 'Ṫ', 'ṫ' => 'ṫ', 'Ṭ' => 'Ṭ', 'ṭ' => 'ṭ', 'Ṯ' => 'Ṯ', 'ṯ' => 'ṯ', 'Ṱ' => 'Ṱ', 'ṱ' => 'ṱ', 'Ṳ' => 'Ṳ', 'ṳ' => 'ṳ', 'Ṵ' => 'Ṵ', 'ṵ' => 'ṵ', 'Ṷ' => 'Ṷ', 'ṷ' => 'ṷ', 'Ṹ' => 'Ṹ', 'ṹ' => 'ṹ', 'Ṻ' => 'Ṻ', 'ṻ' => 'ṻ', 'Ṽ' => 'Ṽ', 'ṽ' => 'ṽ', 'Ṿ' => 'Ṿ', 'ṿ' => 'ṿ', 'Ẁ' => 'Ẁ', 'ẁ' => 'ẁ', 'Ẃ' => 'Ẃ', 'ẃ' => 'ẃ', 'Ẅ' => 'Ẅ', 'ẅ' => 'ẅ', 'Ẇ' => 'Ẇ', 'ẇ' => 'ẇ', 'Ẉ' => 'Ẉ', 'ẉ' => 'ẉ', 'Ẋ' => 'Ẋ', 'ẋ' => 'ẋ', 'Ẍ' => 'Ẍ', 'ẍ' => 'ẍ', 'Ẏ' => 'Ẏ', 'ẏ' => 'ẏ', 'Ẑ' => 'Ẑ', 'ẑ' => 'ẑ', 'Ẓ' => 'Ẓ', 'ẓ' => 'ẓ', 'Ẕ' => 'Ẕ', 'ẕ' => 'ẕ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'ẘ', 'ẙ' => 'ẙ', 'ẛ' => 'ẛ', 'Ạ' => 'Ạ', 'ạ' => 'ạ', 'Ả' => 'Ả', 'ả' => 'ả', 'Ấ' => 'Ấ', 'ấ' => 'ấ', 'Ầ' => 'Ầ', 'ầ' => 'ầ', 'Ẩ' => 'Ẩ', 'ẩ' => 'ẩ', 'Ẫ' => 'Ẫ', 'ẫ' => 'ẫ', 'Ậ' => 'Ậ', 'ậ' => 'ậ', 'Ắ' => 'Ắ', 'ắ' => 'ắ', 'Ằ' => 'Ằ', 'ằ' => 'ằ', 'Ẳ' => 'Ẳ', 'ẳ' => 'ẳ', 'Ẵ' => 'Ẵ', 'ẵ' => 'ẵ', 'Ặ' => 'Ặ', 'ặ' => 'ặ', 'Ẹ' => 'Ẹ', 'ẹ' => 'ẹ', 'Ẻ' => 'Ẻ', 'ẻ' => 'ẻ', 'Ẽ' => 'Ẽ', 'ẽ' => 'ẽ', 'Ế' => 'Ế', 'ế' => 'ế', 'Ề' => 'Ề', 'ề' => 'ề', 'Ể' => 'Ể', 'ể' => 'ể', 'Ễ' => 'Ễ', 'ễ' => 'ễ', 'Ệ' => 'Ệ', 'ệ' => 'ệ', 'Ỉ' => 'Ỉ', 'ỉ' => 'ỉ', 'Ị' => 'Ị', 'ị' => 'ị', 'Ọ' => 'Ọ', 'ọ' => 'ọ', 'Ỏ' => 'Ỏ', 'ỏ' => 'ỏ', 'Ố' => 'Ố', 'ố' => 'ố', 'Ồ' => 'Ồ', 'ồ' => 'ồ', 'Ổ' => 'Ổ', 'ổ' => 'ổ', 'Ỗ' => 'Ỗ', 'ỗ' => 'ỗ', 'Ộ' => 'Ộ', 'ộ' => 'ộ', 'Ớ' => 'Ớ', 'ớ' => 'ớ', 'Ờ' => 'Ờ', 'ờ' => 'ờ', 'Ở' => 'Ở', 'ở' => 'ở', 'Ỡ' => 'Ỡ', 'ỡ' => 'ỡ', 'Ợ' => 'Ợ', 'ợ' => 'ợ', 'Ụ' => 'Ụ', 'ụ' => 'ụ', 'Ủ' => 'Ủ', 'ủ' => 'ủ', 'Ứ' => 'Ứ', 'ứ' => 'ứ', 'Ừ' => 'Ừ', 'ừ' => 'ừ', 'Ử' => 'Ử', 'ử' => 'ử', 'Ữ' => 'Ữ', 'ữ' => 'ữ', 'Ự' => 'Ự', 'ự' => 'ự', 'Ỳ' => 'Ỳ', 'ỳ' => 'ỳ', 'Ỵ' => 'Ỵ', 'ỵ' => 'ỵ', 'Ỷ' => 'Ỷ', 'ỷ' => 'ỷ', 'Ỹ' => 'Ỹ', 'ỹ' => 'ỹ', 'ἀ' => 'ἀ', 'ἁ' => 'ἁ', 'ἂ' => 'ἂ', 'ἃ' => 'ἃ', 'ἄ' => 'ἄ', 'ἅ' => 'ἅ', 'ἆ' => 'ἆ', 'ἇ' => 'ἇ', 'Ἀ' => 'Ἀ', 'Ἁ' => 'Ἁ', 'Ἂ' => 'Ἂ', 'Ἃ' => 'Ἃ', 'Ἄ' => 'Ἄ', 'Ἅ' => 'Ἅ', 'Ἆ' => 'Ἆ', 'Ἇ' => 'Ἇ', 'ἐ' => 'ἐ', 'ἑ' => 'ἑ', 'ἒ' => 'ἒ', 'ἓ' => 'ἓ', 'ἔ' => 'ἔ', 'ἕ' => 'ἕ', 'Ἐ' => 'Ἐ', 'Ἑ' => 'Ἑ', 'Ἒ' => 'Ἒ', 'Ἓ' => 'Ἓ', 'Ἔ' => 'Ἔ', 'Ἕ' => 'Ἕ', 'ἠ' => 'ἠ', 'ἡ' => 'ἡ', 'ἢ' => 'ἢ', 'ἣ' => 'ἣ', 'ἤ' => 'ἤ', 'ἥ' => 'ἥ', 'ἦ' => 'ἦ', 'ἧ' => 'ἧ', 'Ἠ' => 'Ἠ', 'Ἡ' => 'Ἡ', 'Ἢ' => 'Ἢ', 'Ἣ' => 'Ἣ', 'Ἤ' => 'Ἤ', 'Ἥ' => 'Ἥ', 'Ἦ' => 'Ἦ', 'Ἧ' => 'Ἧ', 'ἰ' => 'ἰ', 'ἱ' => 'ἱ', 'ἲ' => 'ἲ', 'ἳ' => 'ἳ', 'ἴ' => 'ἴ', 'ἵ' => 'ἵ', 'ἶ' => 'ἶ', 'ἷ' => 'ἷ', 'Ἰ' => 'Ἰ', 'Ἱ' => 'Ἱ', 'Ἲ' => 'Ἲ', 'Ἳ' => 'Ἳ', 'Ἴ' => 'Ἴ', 'Ἵ' => 'Ἵ', 'Ἶ' => 'Ἶ', 'Ἷ' => 'Ἷ', 'ὀ' => 'ὀ', 'ὁ' => 'ὁ', 'ὂ' => 'ὂ', 'ὃ' => 'ὃ', 'ὄ' => 'ὄ', 'ὅ' => 'ὅ', 'Ὀ' => 'Ὀ', 'Ὁ' => 'Ὁ', 'Ὂ' => 'Ὂ', 'Ὃ' => 'Ὃ', 'Ὄ' => 'Ὄ', 'Ὅ' => 'Ὅ', 'ὐ' => 'ὐ', 'ὑ' => 'ὑ', 'ὒ' => 'ὒ', 'ὓ' => 'ὓ', 'ὔ' => 'ὔ', 'ὕ' => 'ὕ', 'ὖ' => 'ὖ', 'ὗ' => 'ὗ', 'Ὑ' => 'Ὑ', 'Ὓ' => 'Ὓ', 'Ὕ' => 'Ὕ', 'Ὗ' => 'Ὗ', 'ὠ' => 'ὠ', 'ὡ' => 'ὡ', 'ὢ' => 'ὢ', 'ὣ' => 'ὣ', 'ὤ' => 'ὤ', 'ὥ' => 'ὥ', 'ὦ' => 'ὦ', 'ὧ' => 'ὧ', 'Ὠ' => 'Ὠ', 'Ὡ' => 'Ὡ', 'Ὢ' => 'Ὢ', 'Ὣ' => 'Ὣ', 'Ὤ' => 'Ὤ', 'Ὥ' => 'Ὥ', 'Ὦ' => 'Ὦ', 'Ὧ' => 'Ὧ', 'ὰ' => 'ὰ', 'ὲ' => 'ὲ', 'ὴ' => 'ὴ', 'ὶ' => 'ὶ', 'ὸ' => 'ὸ', 'ὺ' => 'ὺ', 'ὼ' => 'ὼ', 'ᾀ' => 'ᾀ', 'ᾁ' => 'ᾁ', 'ᾂ' => 'ᾂ', 'ᾃ' => 'ᾃ', 'ᾄ' => 'ᾄ', 'ᾅ' => 'ᾅ', 'ᾆ' => 'ᾆ', 'ᾇ' => 'ᾇ', 'ᾈ' => 'ᾈ', 'ᾉ' => 'ᾉ', 'ᾊ' => 'ᾊ', 'ᾋ' => 'ᾋ', 'ᾌ' => 'ᾌ', 'ᾍ' => 'ᾍ', 'ᾎ' => 'ᾎ', 'ᾏ' => 'ᾏ', 'ᾐ' => 'ᾐ', 'ᾑ' => 'ᾑ', 'ᾒ' => 'ᾒ', 'ᾓ' => 'ᾓ', 'ᾔ' => 'ᾔ', 'ᾕ' => 'ᾕ', 'ᾖ' => 'ᾖ', 'ᾗ' => 'ᾗ', 'ᾘ' => 'ᾘ', 'ᾙ' => 'ᾙ', 'ᾚ' => 'ᾚ', 'ᾛ' => 'ᾛ', 'ᾜ' => 'ᾜ', 'ᾝ' => 'ᾝ', 'ᾞ' => 'ᾞ', 'ᾟ' => 'ᾟ', 'ᾠ' => 'ᾠ', 'ᾡ' => 'ᾡ', 'ᾢ' => 'ᾢ', 'ᾣ' => 'ᾣ', 'ᾤ' => 'ᾤ', 'ᾥ' => 'ᾥ', 'ᾦ' => 'ᾦ', 'ᾧ' => 'ᾧ', 'ᾨ' => 'ᾨ', 'ᾩ' => 'ᾩ', 'ᾪ' => 'ᾪ', 'ᾫ' => 'ᾫ', 'ᾬ' => 'ᾬ', 'ᾭ' => 'ᾭ', 'ᾮ' => 'ᾮ', 'ᾯ' => 'ᾯ', 'ᾰ' => 'ᾰ', 'ᾱ' => 'ᾱ', 'ᾲ' => 'ᾲ', 'ᾳ' => 'ᾳ', 'ᾴ' => 'ᾴ', 'ᾶ' => 'ᾶ', 'ᾷ' => 'ᾷ', 'Ᾰ' => 'Ᾰ', 'Ᾱ' => 'Ᾱ', 'Ὰ' => 'Ὰ', 'ᾼ' => 'ᾼ', '῁' => '῁', 'ῂ' => 'ῂ', 'ῃ' => 'ῃ', 'ῄ' => 'ῄ', 'ῆ' => 'ῆ', 'ῇ' => 'ῇ', 'Ὲ' => 'Ὲ', 'Ὴ' => 'Ὴ', 'ῌ' => 'ῌ', '῍' => '῍', '῎' => '῎', '῏' => '῏', 'ῐ' => 'ῐ', 'ῑ' => 'ῑ', 'ῒ' => 'ῒ', 'ῖ' => 'ῖ', 'ῗ' => 'ῗ', 'Ῐ' => 'Ῐ', 'Ῑ' => 'Ῑ', 'Ὶ' => 'Ὶ', '῝' => '῝', '῞' => '῞', '῟' => '῟', 'ῠ' => 'ῠ', 'ῡ' => 'ῡ', 'ῢ' => 'ῢ', 'ῤ' => 'ῤ', 'ῥ' => 'ῥ', 'ῦ' => 'ῦ', 'ῧ' => 'ῧ', 'Ῠ' => 'Ῠ', 'Ῡ' => 'Ῡ', 'Ὺ' => 'Ὺ', 'Ῥ' => 'Ῥ', '῭' => '῭', 'ῲ' => 'ῲ', 'ῳ' => 'ῳ', 'ῴ' => 'ῴ', 'ῶ' => 'ῶ', 'ῷ' => 'ῷ', 'Ὸ' => 'Ὸ', 'Ὼ' => 'Ὼ', 'ῼ' => 'ῼ', '↚' => '↚', '↛' => '↛', '↮' => '↮', '⇍' => '⇍', '⇎' => '⇎', '⇏' => '⇏', '∄' => '∄', '∉' => '∉', '∌' => '∌', '∤' => '∤', '∦' => '∦', '≁' => '≁', '≄' => '≄', '≇' => '≇', '≉' => '≉', '≠' => '≠', '≢' => '≢', '≭' => '≭', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≴' => '≴', '≵' => '≵', '≸' => '≸', '≹' => '≹', '⊀' => '⊀', '⊁' => '⊁', '⊄' => '⊄', '⊅' => '⊅', '⊈' => '⊈', '⊉' => '⊉', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', '⋠' => '⋠', '⋡' => '⋡', '⋢' => '⋢', '⋣' => '⋣', '⋪' => '⋪', '⋫' => '⋫', '⋬' => '⋬', '⋭' => '⋭', 'が' => 'が', 'ぎ' => 'ぎ', 'ぐ' => 'ぐ', 'げ' => 'げ', 'ご' => 'ご', 'ざ' => 'ざ', 'じ' => 'じ', 'ず' => 'ず', 'ぜ' => 'ぜ', 'ぞ' => 'ぞ', 'だ' => 'だ', 'ぢ' => 'ぢ', 'づ' => 'づ', 'で' => 'で', 'ど' => 'ど', 'ば' => 'ば', 'ぱ' => 'ぱ', 'び' => 'び', 'ぴ' => 'ぴ', 'ぶ' => 'ぶ', 'ぷ' => 'ぷ', 'べ' => 'べ', 'ぺ' => 'ぺ', 'ぼ' => 'ぼ', 'ぽ' => 'ぽ', 'ゔ' => 'ゔ', 'ゞ' => 'ゞ', 'ガ' => 'ガ', 'ギ' => 'ギ', 'グ' => 'グ', 'ゲ' => 'ゲ', 'ゴ' => 'ゴ', 'ザ' => 'ザ', 'ジ' => 'ジ', 'ズ' => 'ズ', 'ゼ' => 'ゼ', 'ゾ' => 'ゾ', 'ダ' => 'ダ', 'ヂ' => 'ヂ', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド', 'バ' => 'バ', 'パ' => 'パ', 'ビ' => 'ビ', 'ピ' => 'ピ', 'ブ' => 'ブ', 'プ' => 'プ', 'ベ' => 'ベ', 'ペ' => 'ペ', 'ボ' => 'ボ', 'ポ' => 'ポ', 'ヴ' => 'ヴ', 'ヷ' => 'ヷ', 'ヸ' => 'ヸ', 'ヹ' => 'ヹ', 'ヺ' => 'ヺ', 'ヾ' => 'ヾ', '𑂚' => '𑂚', '𑂜' => '𑂜', '𑂫' => '𑂫', '𑄮' => '𑄮', '𑄯' => '𑄯', '𑍋' => '𑍋', '𑍌' => '𑍌', '𑒻' => '𑒻', '𑒼' => '𑒼', '𑒾' => '𑒾', '𑖺' => '𑖺', '𑖻' => '𑖻', '𑤸' => '𑤸'); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php new file mode 100644 index 00000000..d484ce02 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php @@ -0,0 +1,5 @@ + 'À', 'Á' => 'Á', 'Â' => 'Â', 'Ã' => 'Ã', 'Ä' => 'Ä', 'Å' => 'Å', 'Ç' => 'Ç', 'È' => 'È', 'É' => 'É', 'Ê' => 'Ê', 'Ë' => 'Ë', 'Ì' => 'Ì', 'Í' => 'Í', 'Î' => 'Î', 'Ï' => 'Ï', 'Ñ' => 'Ñ', 'Ò' => 'Ò', 'Ó' => 'Ó', 'Ô' => 'Ô', 'Õ' => 'Õ', 'Ö' => 'Ö', 'Ù' => 'Ù', 'Ú' => 'Ú', 'Û' => 'Û', 'Ü' => 'Ü', 'Ý' => 'Ý', 'à' => 'à', 'á' => 'á', 'â' => 'â', 'ã' => 'ã', 'ä' => 'ä', 'å' => 'å', 'ç' => 'ç', 'è' => 'è', 'é' => 'é', 'ê' => 'ê', 'ë' => 'ë', 'ì' => 'ì', 'í' => 'í', 'î' => 'î', 'ï' => 'ï', 'ñ' => 'ñ', 'ò' => 'ò', 'ó' => 'ó', 'ô' => 'ô', 'õ' => 'õ', 'ö' => 'ö', 'ù' => 'ù', 'ú' => 'ú', 'û' => 'û', 'ü' => 'ü', 'ý' => 'ý', 'ÿ' => 'ÿ', 'Ā' => 'Ā', 'ā' => 'ā', 'Ă' => 'Ă', 'ă' => 'ă', 'Ą' => 'Ą', 'ą' => 'ą', 'Ć' => 'Ć', 'ć' => 'ć', 'Ĉ' => 'Ĉ', 'ĉ' => 'ĉ', 'Ċ' => 'Ċ', 'ċ' => 'ċ', 'Č' => 'Č', 'č' => 'č', 'Ď' => 'Ď', 'ď' => 'ď', 'Ē' => 'Ē', 'ē' => 'ē', 'Ĕ' => 'Ĕ', 'ĕ' => 'ĕ', 'Ė' => 'Ė', 'ė' => 'ė', 'Ę' => 'Ę', 'ę' => 'ę', 'Ě' => 'Ě', 'ě' => 'ě', 'Ĝ' => 'Ĝ', 'ĝ' => 'ĝ', 'Ğ' => 'Ğ', 'ğ' => 'ğ', 'Ġ' => 'Ġ', 'ġ' => 'ġ', 'Ģ' => 'Ģ', 'ģ' => 'ģ', 'Ĥ' => 'Ĥ', 'ĥ' => 'ĥ', 'Ĩ' => 'Ĩ', 'ĩ' => 'ĩ', 'Ī' => 'Ī', 'ī' => 'ī', 'Ĭ' => 'Ĭ', 'ĭ' => 'ĭ', 'Į' => 'Į', 'į' => 'į', 'İ' => 'İ', 'Ĵ' => 'Ĵ', 'ĵ' => 'ĵ', 'Ķ' => 'Ķ', 'ķ' => 'ķ', 'Ĺ' => 'Ĺ', 'ĺ' => 'ĺ', 'Ļ' => 'Ļ', 'ļ' => 'ļ', 'Ľ' => 'Ľ', 'ľ' => 'ľ', 'Ń' => 'Ń', 'ń' => 'ń', 'Ņ' => 'Ņ', 'ņ' => 'ņ', 'Ň' => 'Ň', 'ň' => 'ň', 'Ō' => 'Ō', 'ō' => 'ō', 'Ŏ' => 'Ŏ', 'ŏ' => 'ŏ', 'Ő' => 'Ő', 'ő' => 'ő', 'Ŕ' => 'Ŕ', 'ŕ' => 'ŕ', 'Ŗ' => 'Ŗ', 'ŗ' => 'ŗ', 'Ř' => 'Ř', 'ř' => 'ř', 'Ś' => 'Ś', 'ś' => 'ś', 'Ŝ' => 'Ŝ', 'ŝ' => 'ŝ', 'Ş' => 'Ş', 'ş' => 'ş', 'Š' => 'Š', 'š' => 'š', 'Ţ' => 'Ţ', 'ţ' => 'ţ', 'Ť' => 'Ť', 'ť' => 'ť', 'Ũ' => 'Ũ', 'ũ' => 'ũ', 'Ū' => 'Ū', 'ū' => 'ū', 'Ŭ' => 'Ŭ', 'ŭ' => 'ŭ', 'Ů' => 'Ů', 'ů' => 'ů', 'Ű' => 'Ű', 'ű' => 'ű', 'Ų' => 'Ų', 'ų' => 'ų', 'Ŵ' => 'Ŵ', 'ŵ' => 'ŵ', 'Ŷ' => 'Ŷ', 'ŷ' => 'ŷ', 'Ÿ' => 'Ÿ', 'Ź' => 'Ź', 'ź' => 'ź', 'Ż' => 'Ż', 'ż' => 'ż', 'Ž' => 'Ž', 'ž' => 'ž', 'Ơ' => 'Ơ', 'ơ' => 'ơ', 'Ư' => 'Ư', 'ư' => 'ư', 'Ǎ' => 'Ǎ', 'ǎ' => 'ǎ', 'Ǐ' => 'Ǐ', 'ǐ' => 'ǐ', 'Ǒ' => 'Ǒ', 'ǒ' => 'ǒ', 'Ǔ' => 'Ǔ', 'ǔ' => 'ǔ', 'Ǖ' => 'Ǖ', 'ǖ' => 'ǖ', 'Ǘ' => 'Ǘ', 'ǘ' => 'ǘ', 'Ǚ' => 'Ǚ', 'ǚ' => 'ǚ', 'Ǜ' => 'Ǜ', 'ǜ' => 'ǜ', 'Ǟ' => 'Ǟ', 'ǟ' => 'ǟ', 'Ǡ' => 'Ǡ', 'ǡ' => 'ǡ', 'Ǣ' => 'Ǣ', 'ǣ' => 'ǣ', 'Ǧ' => 'Ǧ', 'ǧ' => 'ǧ', 'Ǩ' => 'Ǩ', 'ǩ' => 'ǩ', 'Ǫ' => 'Ǫ', 'ǫ' => 'ǫ', 'Ǭ' => 'Ǭ', 'ǭ' => 'ǭ', 'Ǯ' => 'Ǯ', 'ǯ' => 'ǯ', 'ǰ' => 'ǰ', 'Ǵ' => 'Ǵ', 'ǵ' => 'ǵ', 'Ǹ' => 'Ǹ', 'ǹ' => 'ǹ', 'Ǻ' => 'Ǻ', 'ǻ' => 'ǻ', 'Ǽ' => 'Ǽ', 'ǽ' => 'ǽ', 'Ǿ' => 'Ǿ', 'ǿ' => 'ǿ', 'Ȁ' => 'Ȁ', 'ȁ' => 'ȁ', 'Ȃ' => 'Ȃ', 'ȃ' => 'ȃ', 'Ȅ' => 'Ȅ', 'ȅ' => 'ȅ', 'Ȇ' => 'Ȇ', 'ȇ' => 'ȇ', 'Ȉ' => 'Ȉ', 'ȉ' => 'ȉ', 'Ȋ' => 'Ȋ', 'ȋ' => 'ȋ', 'Ȍ' => 'Ȍ', 'ȍ' => 'ȍ', 'Ȏ' => 'Ȏ', 'ȏ' => 'ȏ', 'Ȑ' => 'Ȑ', 'ȑ' => 'ȑ', 'Ȓ' => 'Ȓ', 'ȓ' => 'ȓ', 'Ȕ' => 'Ȕ', 'ȕ' => 'ȕ', 'Ȗ' => 'Ȗ', 'ȗ' => 'ȗ', 'Ș' => 'Ș', 'ș' => 'ș', 'Ț' => 'Ț', 'ț' => 'ț', 'Ȟ' => 'Ȟ', 'ȟ' => 'ȟ', 'Ȧ' => 'Ȧ', 'ȧ' => 'ȧ', 'Ȩ' => 'Ȩ', 'ȩ' => 'ȩ', 'Ȫ' => 'Ȫ', 'ȫ' => 'ȫ', 'Ȭ' => 'Ȭ', 'ȭ' => 'ȭ', 'Ȯ' => 'Ȯ', 'ȯ' => 'ȯ', 'Ȱ' => 'Ȱ', 'ȱ' => 'ȱ', 'Ȳ' => 'Ȳ', 'ȳ' => 'ȳ', '̀' => '̀', '́' => '́', '̓' => '̓', '̈́' => '̈́', 'ʹ' => 'ʹ', ';' => ';', '΅' => '΅', 'Ά' => 'Ά', '·' => '·', 'Έ' => 'Έ', 'Ή' => 'Ή', 'Ί' => 'Ί', 'Ό' => 'Ό', 'Ύ' => 'Ύ', 'Ώ' => 'Ώ', 'ΐ' => 'ΐ', 'Ϊ' => 'Ϊ', 'Ϋ' => 'Ϋ', 'ά' => 'ά', 'έ' => 'έ', 'ή' => 'ή', 'ί' => 'ί', 'ΰ' => 'ΰ', 'ϊ' => 'ϊ', 'ϋ' => 'ϋ', 'ό' => 'ό', 'ύ' => 'ύ', 'ώ' => 'ώ', 'ϓ' => 'ϓ', 'ϔ' => 'ϔ', 'Ѐ' => 'Ѐ', 'Ё' => 'Ё', 'Ѓ' => 'Ѓ', 'Ї' => 'Ї', 'Ќ' => 'Ќ', 'Ѝ' => 'Ѝ', 'Ў' => 'Ў', 'Й' => 'Й', 'й' => 'й', 'ѐ' => 'ѐ', 'ё' => 'ё', 'ѓ' => 'ѓ', 'ї' => 'ї', 'ќ' => 'ќ', 'ѝ' => 'ѝ', 'ў' => 'ў', 'Ѷ' => 'Ѷ', 'ѷ' => 'ѷ', 'Ӂ' => 'Ӂ', 'ӂ' => 'ӂ', 'Ӑ' => 'Ӑ', 'ӑ' => 'ӑ', 'Ӓ' => 'Ӓ', 'ӓ' => 'ӓ', 'Ӗ' => 'Ӗ', 'ӗ' => 'ӗ', 'Ӛ' => 'Ӛ', 'ӛ' => 'ӛ', 'Ӝ' => 'Ӝ', 'ӝ' => 'ӝ', 'Ӟ' => 'Ӟ', 'ӟ' => 'ӟ', 'Ӣ' => 'Ӣ', 'ӣ' => 'ӣ', 'Ӥ' => 'Ӥ', 'ӥ' => 'ӥ', 'Ӧ' => 'Ӧ', 'ӧ' => 'ӧ', 'Ӫ' => 'Ӫ', 'ӫ' => 'ӫ', 'Ӭ' => 'Ӭ', 'ӭ' => 'ӭ', 'Ӯ' => 'Ӯ', 'ӯ' => 'ӯ', 'Ӱ' => 'Ӱ', 'ӱ' => 'ӱ', 'Ӳ' => 'Ӳ', 'ӳ' => 'ӳ', 'Ӵ' => 'Ӵ', 'ӵ' => 'ӵ', 'Ӹ' => 'Ӹ', 'ӹ' => 'ӹ', 'آ' => 'آ', 'أ' => 'أ', 'ؤ' => 'ؤ', 'إ' => 'إ', 'ئ' => 'ئ', 'ۀ' => 'ۀ', 'ۂ' => 'ۂ', 'ۓ' => 'ۓ', 'ऩ' => 'ऩ', 'ऱ' => 'ऱ', 'ऴ' => 'ऴ', 'क़' => 'क़', 'ख़' => 'ख़', 'ग़' => 'ग़', 'ज़' => 'ज़', 'ड़' => 'ड़', 'ढ़' => 'ढ़', 'फ़' => 'फ़', 'य़' => 'य़', 'ো' => 'ো', 'ৌ' => 'ৌ', 'ড়' => 'ড়', 'ঢ়' => 'ঢ়', 'য়' => 'য়', 'ਲ਼' => 'ਲ਼', 'ਸ਼' => 'ਸ਼', 'ਖ਼' => 'ਖ਼', 'ਗ਼' => 'ਗ਼', 'ਜ਼' => 'ਜ਼', 'ਫ਼' => 'ਫ਼', 'ୈ' => 'ୈ', 'ୋ' => 'ୋ', 'ୌ' => 'ୌ', 'ଡ଼' => 'ଡ଼', 'ଢ଼' => 'ଢ଼', 'ஔ' => 'ஔ', 'ொ' => 'ொ', 'ோ' => 'ோ', 'ௌ' => 'ௌ', 'ై' => 'ై', 'ೀ' => 'ೀ', 'ೇ' => 'ೇ', 'ೈ' => 'ೈ', 'ೊ' => 'ೊ', 'ೋ' => 'ೋ', 'ൊ' => 'ൊ', 'ോ' => 'ോ', 'ൌ' => 'ൌ', 'ේ' => 'ේ', 'ො' => 'ො', 'ෝ' => 'ෝ', 'ෞ' => 'ෞ', 'གྷ' => 'གྷ', 'ཌྷ' => 'ཌྷ', 'དྷ' => 'དྷ', 'བྷ' => 'བྷ', 'ཛྷ' => 'ཛྷ', 'ཀྵ' => 'ཀྵ', 'ཱི' => 'ཱི', 'ཱུ' => 'ཱུ', 'ྲྀ' => 'ྲྀ', 'ླྀ' => 'ླྀ', 'ཱྀ' => 'ཱྀ', 'ྒྷ' => 'ྒྷ', 'ྜྷ' => 'ྜྷ', 'ྡྷ' => 'ྡྷ', 'ྦྷ' => 'ྦྷ', 'ྫྷ' => 'ྫྷ', 'ྐྵ' => 'ྐྵ', 'ဦ' => 'ဦ', 'ᬆ' => 'ᬆ', 'ᬈ' => 'ᬈ', 'ᬊ' => 'ᬊ', 'ᬌ' => 'ᬌ', 'ᬎ' => 'ᬎ', 'ᬒ' => 'ᬒ', 'ᬻ' => 'ᬻ', 'ᬽ' => 'ᬽ', 'ᭀ' => 'ᭀ', 'ᭁ' => 'ᭁ', 'ᭃ' => 'ᭃ', 'Ḁ' => 'Ḁ', 'ḁ' => 'ḁ', 'Ḃ' => 'Ḃ', 'ḃ' => 'ḃ', 'Ḅ' => 'Ḅ', 'ḅ' => 'ḅ', 'Ḇ' => 'Ḇ', 'ḇ' => 'ḇ', 'Ḉ' => 'Ḉ', 'ḉ' => 'ḉ', 'Ḋ' => 'Ḋ', 'ḋ' => 'ḋ', 'Ḍ' => 'Ḍ', 'ḍ' => 'ḍ', 'Ḏ' => 'Ḏ', 'ḏ' => 'ḏ', 'Ḑ' => 'Ḑ', 'ḑ' => 'ḑ', 'Ḓ' => 'Ḓ', 'ḓ' => 'ḓ', 'Ḕ' => 'Ḕ', 'ḕ' => 'ḕ', 'Ḗ' => 'Ḗ', 'ḗ' => 'ḗ', 'Ḙ' => 'Ḙ', 'ḙ' => 'ḙ', 'Ḛ' => 'Ḛ', 'ḛ' => 'ḛ', 'Ḝ' => 'Ḝ', 'ḝ' => 'ḝ', 'Ḟ' => 'Ḟ', 'ḟ' => 'ḟ', 'Ḡ' => 'Ḡ', 'ḡ' => 'ḡ', 'Ḣ' => 'Ḣ', 'ḣ' => 'ḣ', 'Ḥ' => 'Ḥ', 'ḥ' => 'ḥ', 'Ḧ' => 'Ḧ', 'ḧ' => 'ḧ', 'Ḩ' => 'Ḩ', 'ḩ' => 'ḩ', 'Ḫ' => 'Ḫ', 'ḫ' => 'ḫ', 'Ḭ' => 'Ḭ', 'ḭ' => 'ḭ', 'Ḯ' => 'Ḯ', 'ḯ' => 'ḯ', 'Ḱ' => 'Ḱ', 'ḱ' => 'ḱ', 'Ḳ' => 'Ḳ', 'ḳ' => 'ḳ', 'Ḵ' => 'Ḵ', 'ḵ' => 'ḵ', 'Ḷ' => 'Ḷ', 'ḷ' => 'ḷ', 'Ḹ' => 'Ḹ', 'ḹ' => 'ḹ', 'Ḻ' => 'Ḻ', 'ḻ' => 'ḻ', 'Ḽ' => 'Ḽ', 'ḽ' => 'ḽ', 'Ḿ' => 'Ḿ', 'ḿ' => 'ḿ', 'Ṁ' => 'Ṁ', 'ṁ' => 'ṁ', 'Ṃ' => 'Ṃ', 'ṃ' => 'ṃ', 'Ṅ' => 'Ṅ', 'ṅ' => 'ṅ', 'Ṇ' => 'Ṇ', 'ṇ' => 'ṇ', 'Ṉ' => 'Ṉ', 'ṉ' => 'ṉ', 'Ṋ' => 'Ṋ', 'ṋ' => 'ṋ', 'Ṍ' => 'Ṍ', 'ṍ' => 'ṍ', 'Ṏ' => 'Ṏ', 'ṏ' => 'ṏ', 'Ṑ' => 'Ṑ', 'ṑ' => 'ṑ', 'Ṓ' => 'Ṓ', 'ṓ' => 'ṓ', 'Ṕ' => 'Ṕ', 'ṕ' => 'ṕ', 'Ṗ' => 'Ṗ', 'ṗ' => 'ṗ', 'Ṙ' => 'Ṙ', 'ṙ' => 'ṙ', 'Ṛ' => 'Ṛ', 'ṛ' => 'ṛ', 'Ṝ' => 'Ṝ', 'ṝ' => 'ṝ', 'Ṟ' => 'Ṟ', 'ṟ' => 'ṟ', 'Ṡ' => 'Ṡ', 'ṡ' => 'ṡ', 'Ṣ' => 'Ṣ', 'ṣ' => 'ṣ', 'Ṥ' => 'Ṥ', 'ṥ' => 'ṥ', 'Ṧ' => 'Ṧ', 'ṧ' => 'ṧ', 'Ṩ' => 'Ṩ', 'ṩ' => 'ṩ', 'Ṫ' => 'Ṫ', 'ṫ' => 'ṫ', 'Ṭ' => 'Ṭ', 'ṭ' => 'ṭ', 'Ṯ' => 'Ṯ', 'ṯ' => 'ṯ', 'Ṱ' => 'Ṱ', 'ṱ' => 'ṱ', 'Ṳ' => 'Ṳ', 'ṳ' => 'ṳ', 'Ṵ' => 'Ṵ', 'ṵ' => 'ṵ', 'Ṷ' => 'Ṷ', 'ṷ' => 'ṷ', 'Ṹ' => 'Ṹ', 'ṹ' => 'ṹ', 'Ṻ' => 'Ṻ', 'ṻ' => 'ṻ', 'Ṽ' => 'Ṽ', 'ṽ' => 'ṽ', 'Ṿ' => 'Ṿ', 'ṿ' => 'ṿ', 'Ẁ' => 'Ẁ', 'ẁ' => 'ẁ', 'Ẃ' => 'Ẃ', 'ẃ' => 'ẃ', 'Ẅ' => 'Ẅ', 'ẅ' => 'ẅ', 'Ẇ' => 'Ẇ', 'ẇ' => 'ẇ', 'Ẉ' => 'Ẉ', 'ẉ' => 'ẉ', 'Ẋ' => 'Ẋ', 'ẋ' => 'ẋ', 'Ẍ' => 'Ẍ', 'ẍ' => 'ẍ', 'Ẏ' => 'Ẏ', 'ẏ' => 'ẏ', 'Ẑ' => 'Ẑ', 'ẑ' => 'ẑ', 'Ẓ' => 'Ẓ', 'ẓ' => 'ẓ', 'Ẕ' => 'Ẕ', 'ẕ' => 'ẕ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'ẘ', 'ẙ' => 'ẙ', 'ẛ' => 'ẛ', 'Ạ' => 'Ạ', 'ạ' => 'ạ', 'Ả' => 'Ả', 'ả' => 'ả', 'Ấ' => 'Ấ', 'ấ' => 'ấ', 'Ầ' => 'Ầ', 'ầ' => 'ầ', 'Ẩ' => 'Ẩ', 'ẩ' => 'ẩ', 'Ẫ' => 'Ẫ', 'ẫ' => 'ẫ', 'Ậ' => 'Ậ', 'ậ' => 'ậ', 'Ắ' => 'Ắ', 'ắ' => 'ắ', 'Ằ' => 'Ằ', 'ằ' => 'ằ', 'Ẳ' => 'Ẳ', 'ẳ' => 'ẳ', 'Ẵ' => 'Ẵ', 'ẵ' => 'ẵ', 'Ặ' => 'Ặ', 'ặ' => 'ặ', 'Ẹ' => 'Ẹ', 'ẹ' => 'ẹ', 'Ẻ' => 'Ẻ', 'ẻ' => 'ẻ', 'Ẽ' => 'Ẽ', 'ẽ' => 'ẽ', 'Ế' => 'Ế', 'ế' => 'ế', 'Ề' => 'Ề', 'ề' => 'ề', 'Ể' => 'Ể', 'ể' => 'ể', 'Ễ' => 'Ễ', 'ễ' => 'ễ', 'Ệ' => 'Ệ', 'ệ' => 'ệ', 'Ỉ' => 'Ỉ', 'ỉ' => 'ỉ', 'Ị' => 'Ị', 'ị' => 'ị', 'Ọ' => 'Ọ', 'ọ' => 'ọ', 'Ỏ' => 'Ỏ', 'ỏ' => 'ỏ', 'Ố' => 'Ố', 'ố' => 'ố', 'Ồ' => 'Ồ', 'ồ' => 'ồ', 'Ổ' => 'Ổ', 'ổ' => 'ổ', 'Ỗ' => 'Ỗ', 'ỗ' => 'ỗ', 'Ộ' => 'Ộ', 'ộ' => 'ộ', 'Ớ' => 'Ớ', 'ớ' => 'ớ', 'Ờ' => 'Ờ', 'ờ' => 'ờ', 'Ở' => 'Ở', 'ở' => 'ở', 'Ỡ' => 'Ỡ', 'ỡ' => 'ỡ', 'Ợ' => 'Ợ', 'ợ' => 'ợ', 'Ụ' => 'Ụ', 'ụ' => 'ụ', 'Ủ' => 'Ủ', 'ủ' => 'ủ', 'Ứ' => 'Ứ', 'ứ' => 'ứ', 'Ừ' => 'Ừ', 'ừ' => 'ừ', 'Ử' => 'Ử', 'ử' => 'ử', 'Ữ' => 'Ữ', 'ữ' => 'ữ', 'Ự' => 'Ự', 'ự' => 'ự', 'Ỳ' => 'Ỳ', 'ỳ' => 'ỳ', 'Ỵ' => 'Ỵ', 'ỵ' => 'ỵ', 'Ỷ' => 'Ỷ', 'ỷ' => 'ỷ', 'Ỹ' => 'Ỹ', 'ỹ' => 'ỹ', 'ἀ' => 'ἀ', 'ἁ' => 'ἁ', 'ἂ' => 'ἂ', 'ἃ' => 'ἃ', 'ἄ' => 'ἄ', 'ἅ' => 'ἅ', 'ἆ' => 'ἆ', 'ἇ' => 'ἇ', 'Ἀ' => 'Ἀ', 'Ἁ' => 'Ἁ', 'Ἂ' => 'Ἂ', 'Ἃ' => 'Ἃ', 'Ἄ' => 'Ἄ', 'Ἅ' => 'Ἅ', 'Ἆ' => 'Ἆ', 'Ἇ' => 'Ἇ', 'ἐ' => 'ἐ', 'ἑ' => 'ἑ', 'ἒ' => 'ἒ', 'ἓ' => 'ἓ', 'ἔ' => 'ἔ', 'ἕ' => 'ἕ', 'Ἐ' => 'Ἐ', 'Ἑ' => 'Ἑ', 'Ἒ' => 'Ἒ', 'Ἓ' => 'Ἓ', 'Ἔ' => 'Ἔ', 'Ἕ' => 'Ἕ', 'ἠ' => 'ἠ', 'ἡ' => 'ἡ', 'ἢ' => 'ἢ', 'ἣ' => 'ἣ', 'ἤ' => 'ἤ', 'ἥ' => 'ἥ', 'ἦ' => 'ἦ', 'ἧ' => 'ἧ', 'Ἠ' => 'Ἠ', 'Ἡ' => 'Ἡ', 'Ἢ' => 'Ἢ', 'Ἣ' => 'Ἣ', 'Ἤ' => 'Ἤ', 'Ἥ' => 'Ἥ', 'Ἦ' => 'Ἦ', 'Ἧ' => 'Ἧ', 'ἰ' => 'ἰ', 'ἱ' => 'ἱ', 'ἲ' => 'ἲ', 'ἳ' => 'ἳ', 'ἴ' => 'ἴ', 'ἵ' => 'ἵ', 'ἶ' => 'ἶ', 'ἷ' => 'ἷ', 'Ἰ' => 'Ἰ', 'Ἱ' => 'Ἱ', 'Ἲ' => 'Ἲ', 'Ἳ' => 'Ἳ', 'Ἴ' => 'Ἴ', 'Ἵ' => 'Ἵ', 'Ἶ' => 'Ἶ', 'Ἷ' => 'Ἷ', 'ὀ' => 'ὀ', 'ὁ' => 'ὁ', 'ὂ' => 'ὂ', 'ὃ' => 'ὃ', 'ὄ' => 'ὄ', 'ὅ' => 'ὅ', 'Ὀ' => 'Ὀ', 'Ὁ' => 'Ὁ', 'Ὂ' => 'Ὂ', 'Ὃ' => 'Ὃ', 'Ὄ' => 'Ὄ', 'Ὅ' => 'Ὅ', 'ὐ' => 'ὐ', 'ὑ' => 'ὑ', 'ὒ' => 'ὒ', 'ὓ' => 'ὓ', 'ὔ' => 'ὔ', 'ὕ' => 'ὕ', 'ὖ' => 'ὖ', 'ὗ' => 'ὗ', 'Ὑ' => 'Ὑ', 'Ὓ' => 'Ὓ', 'Ὕ' => 'Ὕ', 'Ὗ' => 'Ὗ', 'ὠ' => 'ὠ', 'ὡ' => 'ὡ', 'ὢ' => 'ὢ', 'ὣ' => 'ὣ', 'ὤ' => 'ὤ', 'ὥ' => 'ὥ', 'ὦ' => 'ὦ', 'ὧ' => 'ὧ', 'Ὠ' => 'Ὠ', 'Ὡ' => 'Ὡ', 'Ὢ' => 'Ὢ', 'Ὣ' => 'Ὣ', 'Ὤ' => 'Ὤ', 'Ὥ' => 'Ὥ', 'Ὦ' => 'Ὦ', 'Ὧ' => 'Ὧ', 'ὰ' => 'ὰ', 'ά' => 'ά', 'ὲ' => 'ὲ', 'έ' => 'έ', 'ὴ' => 'ὴ', 'ή' => 'ή', 'ὶ' => 'ὶ', 'ί' => 'ί', 'ὸ' => 'ὸ', 'ό' => 'ό', 'ὺ' => 'ὺ', 'ύ' => 'ύ', 'ὼ' => 'ὼ', 'ώ' => 'ώ', 'ᾀ' => 'ᾀ', 'ᾁ' => 'ᾁ', 'ᾂ' => 'ᾂ', 'ᾃ' => 'ᾃ', 'ᾄ' => 'ᾄ', 'ᾅ' => 'ᾅ', 'ᾆ' => 'ᾆ', 'ᾇ' => 'ᾇ', 'ᾈ' => 'ᾈ', 'ᾉ' => 'ᾉ', 'ᾊ' => 'ᾊ', 'ᾋ' => 'ᾋ', 'ᾌ' => 'ᾌ', 'ᾍ' => 'ᾍ', 'ᾎ' => 'ᾎ', 'ᾏ' => 'ᾏ', 'ᾐ' => 'ᾐ', 'ᾑ' => 'ᾑ', 'ᾒ' => 'ᾒ', 'ᾓ' => 'ᾓ', 'ᾔ' => 'ᾔ', 'ᾕ' => 'ᾕ', 'ᾖ' => 'ᾖ', 'ᾗ' => 'ᾗ', 'ᾘ' => 'ᾘ', 'ᾙ' => 'ᾙ', 'ᾚ' => 'ᾚ', 'ᾛ' => 'ᾛ', 'ᾜ' => 'ᾜ', 'ᾝ' => 'ᾝ', 'ᾞ' => 'ᾞ', 'ᾟ' => 'ᾟ', 'ᾠ' => 'ᾠ', 'ᾡ' => 'ᾡ', 'ᾢ' => 'ᾢ', 'ᾣ' => 'ᾣ', 'ᾤ' => 'ᾤ', 'ᾥ' => 'ᾥ', 'ᾦ' => 'ᾦ', 'ᾧ' => 'ᾧ', 'ᾨ' => 'ᾨ', 'ᾩ' => 'ᾩ', 'ᾪ' => 'ᾪ', 'ᾫ' => 'ᾫ', 'ᾬ' => 'ᾬ', 'ᾭ' => 'ᾭ', 'ᾮ' => 'ᾮ', 'ᾯ' => 'ᾯ', 'ᾰ' => 'ᾰ', 'ᾱ' => 'ᾱ', 'ᾲ' => 'ᾲ', 'ᾳ' => 'ᾳ', 'ᾴ' => 'ᾴ', 'ᾶ' => 'ᾶ', 'ᾷ' => 'ᾷ', 'Ᾰ' => 'Ᾰ', 'Ᾱ' => 'Ᾱ', 'Ὰ' => 'Ὰ', 'Ά' => 'Ά', 'ᾼ' => 'ᾼ', 'ι' => 'ι', '῁' => '῁', 'ῂ' => 'ῂ', 'ῃ' => 'ῃ', 'ῄ' => 'ῄ', 'ῆ' => 'ῆ', 'ῇ' => 'ῇ', 'Ὲ' => 'Ὲ', 'Έ' => 'Έ', 'Ὴ' => 'Ὴ', 'Ή' => 'Ή', 'ῌ' => 'ῌ', '῍' => '῍', '῎' => '῎', '῏' => '῏', 'ῐ' => 'ῐ', 'ῑ' => 'ῑ', 'ῒ' => 'ῒ', 'ΐ' => 'ΐ', 'ῖ' => 'ῖ', 'ῗ' => 'ῗ', 'Ῐ' => 'Ῐ', 'Ῑ' => 'Ῑ', 'Ὶ' => 'Ὶ', 'Ί' => 'Ί', '῝' => '῝', '῞' => '῞', '῟' => '῟', 'ῠ' => 'ῠ', 'ῡ' => 'ῡ', 'ῢ' => 'ῢ', 'ΰ' => 'ΰ', 'ῤ' => 'ῤ', 'ῥ' => 'ῥ', 'ῦ' => 'ῦ', 'ῧ' => 'ῧ', 'Ῠ' => 'Ῠ', 'Ῡ' => 'Ῡ', 'Ὺ' => 'Ὺ', 'Ύ' => 'Ύ', 'Ῥ' => 'Ῥ', '῭' => '῭', '΅' => '΅', '`' => '`', 'ῲ' => 'ῲ', 'ῳ' => 'ῳ', 'ῴ' => 'ῴ', 'ῶ' => 'ῶ', 'ῷ' => 'ῷ', 'Ὸ' => 'Ὸ', 'Ό' => 'Ό', 'Ὼ' => 'Ὼ', 'Ώ' => 'Ώ', 'ῼ' => 'ῼ', '´' => '´', ' ' => ' ', ' ' => ' ', 'Ω' => 'Ω', 'K' => 'K', 'Å' => 'Å', '↚' => '↚', '↛' => '↛', '↮' => '↮', '⇍' => '⇍', '⇎' => '⇎', '⇏' => '⇏', '∄' => '∄', '∉' => '∉', '∌' => '∌', '∤' => '∤', '∦' => '∦', '≁' => '≁', '≄' => '≄', '≇' => '≇', '≉' => '≉', '≠' => '≠', '≢' => '≢', '≭' => '≭', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≴' => '≴', '≵' => '≵', '≸' => '≸', '≹' => '≹', '⊀' => '⊀', '⊁' => '⊁', '⊄' => '⊄', '⊅' => '⊅', '⊈' => '⊈', '⊉' => '⊉', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', '⋠' => '⋠', '⋡' => '⋡', '⋢' => '⋢', '⋣' => '⋣', '⋪' => '⋪', '⋫' => '⋫', '⋬' => '⋬', '⋭' => '⋭', '〈' => '〈', '〉' => '〉', '⫝̸' => '⫝̸', 'が' => 'が', 'ぎ' => 'ぎ', 'ぐ' => 'ぐ', 'げ' => 'げ', 'ご' => 'ご', 'ざ' => 'ざ', 'じ' => 'じ', 'ず' => 'ず', 'ぜ' => 'ぜ', 'ぞ' => 'ぞ', 'だ' => 'だ', 'ぢ' => 'ぢ', 'づ' => 'づ', 'で' => 'で', 'ど' => 'ど', 'ば' => 'ば', 'ぱ' => 'ぱ', 'び' => 'び', 'ぴ' => 'ぴ', 'ぶ' => 'ぶ', 'ぷ' => 'ぷ', 'べ' => 'べ', 'ぺ' => 'ぺ', 'ぼ' => 'ぼ', 'ぽ' => 'ぽ', 'ゔ' => 'ゔ', 'ゞ' => 'ゞ', 'ガ' => 'ガ', 'ギ' => 'ギ', 'グ' => 'グ', 'ゲ' => 'ゲ', 'ゴ' => 'ゴ', 'ザ' => 'ザ', 'ジ' => 'ジ', 'ズ' => 'ズ', 'ゼ' => 'ゼ', 'ゾ' => 'ゾ', 'ダ' => 'ダ', 'ヂ' => 'ヂ', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド', 'バ' => 'バ', 'パ' => 'パ', 'ビ' => 'ビ', 'ピ' => 'ピ', 'ブ' => 'ブ', 'プ' => 'プ', 'ベ' => 'ベ', 'ペ' => 'ペ', 'ボ' => 'ボ', 'ポ' => 'ポ', 'ヴ' => 'ヴ', 'ヷ' => 'ヷ', 'ヸ' => 'ヸ', 'ヹ' => 'ヹ', 'ヺ' => 'ヺ', 'ヾ' => 'ヾ', '豈' => '豈', '更' => '更', '車' => '車', '賈' => '賈', '滑' => '滑', '串' => '串', '句' => '句', '龜' => '龜', '龜' => '龜', '契' => '契', '金' => '金', '喇' => '喇', '奈' => '奈', '懶' => '懶', '癩' => '癩', '羅' => '羅', '蘿' => '蘿', '螺' => '螺', '裸' => '裸', '邏' => '邏', '樂' => '樂', '洛' => '洛', '烙' => '烙', '珞' => '珞', '落' => '落', '酪' => '酪', '駱' => '駱', '亂' => '亂', '卵' => '卵', '欄' => '欄', '爛' => '爛', '蘭' => '蘭', '鸞' => '鸞', '嵐' => '嵐', '濫' => '濫', '藍' => '藍', '襤' => '襤', '拉' => '拉', '臘' => '臘', '蠟' => '蠟', '廊' => '廊', '朗' => '朗', '浪' => '浪', '狼' => '狼', '郎' => '郎', '來' => '來', '冷' => '冷', '勞' => '勞', '擄' => '擄', '櫓' => '櫓', '爐' => '爐', '盧' => '盧', '老' => '老', '蘆' => '蘆', '虜' => '虜', '路' => '路', '露' => '露', '魯' => '魯', '鷺' => '鷺', '碌' => '碌', '祿' => '祿', '綠' => '綠', '菉' => '菉', '錄' => '錄', '鹿' => '鹿', '論' => '論', '壟' => '壟', '弄' => '弄', '籠' => '籠', '聾' => '聾', '牢' => '牢', '磊' => '磊', '賂' => '賂', '雷' => '雷', '壘' => '壘', '屢' => '屢', '樓' => '樓', '淚' => '淚', '漏' => '漏', '累' => '累', '縷' => '縷', '陋' => '陋', '勒' => '勒', '肋' => '肋', '凜' => '凜', '凌' => '凌', '稜' => '稜', '綾' => '綾', '菱' => '菱', '陵' => '陵', '讀' => '讀', '拏' => '拏', '樂' => '樂', '諾' => '諾', '丹' => '丹', '寧' => '寧', '怒' => '怒', '率' => '率', '異' => '異', '北' => '北', '磻' => '磻', '便' => '便', '復' => '復', '不' => '不', '泌' => '泌', '數' => '數', '索' => '索', '參' => '參', '塞' => '塞', '省' => '省', '葉' => '葉', '說' => '說', '殺' => '殺', '辰' => '辰', '沈' => '沈', '拾' => '拾', '若' => '若', '掠' => '掠', '略' => '略', '亮' => '亮', '兩' => '兩', '凉' => '凉', '梁' => '梁', '糧' => '糧', '良' => '良', '諒' => '諒', '量' => '量', '勵' => '勵', '呂' => '呂', '女' => '女', '廬' => '廬', '旅' => '旅', '濾' => '濾', '礪' => '礪', '閭' => '閭', '驪' => '驪', '麗' => '麗', '黎' => '黎', '力' => '力', '曆' => '曆', '歷' => '歷', '轢' => '轢', '年' => '年', '憐' => '憐', '戀' => '戀', '撚' => '撚', '漣' => '漣', '煉' => '煉', '璉' => '璉', '秊' => '秊', '練' => '練', '聯' => '聯', '輦' => '輦', '蓮' => '蓮', '連' => '連', '鍊' => '鍊', '列' => '列', '劣' => '劣', '咽' => '咽', '烈' => '烈', '裂' => '裂', '說' => '說', '廉' => '廉', '念' => '念', '捻' => '捻', '殮' => '殮', '簾' => '簾', '獵' => '獵', '令' => '令', '囹' => '囹', '寧' => '寧', '嶺' => '嶺', '怜' => '怜', '玲' => '玲', '瑩' => '瑩', '羚' => '羚', '聆' => '聆', '鈴' => '鈴', '零' => '零', '靈' => '靈', '領' => '領', '例' => '例', '禮' => '禮', '醴' => '醴', '隸' => '隸', '惡' => '惡', '了' => '了', '僚' => '僚', '寮' => '寮', '尿' => '尿', '料' => '料', '樂' => '樂', '燎' => '燎', '療' => '療', '蓼' => '蓼', '遼' => '遼', '龍' => '龍', '暈' => '暈', '阮' => '阮', '劉' => '劉', '杻' => '杻', '柳' => '柳', '流' => '流', '溜' => '溜', '琉' => '琉', '留' => '留', '硫' => '硫', '紐' => '紐', '類' => '類', '六' => '六', '戮' => '戮', '陸' => '陸', '倫' => '倫', '崙' => '崙', '淪' => '淪', '輪' => '輪', '律' => '律', '慄' => '慄', '栗' => '栗', '率' => '率', '隆' => '隆', '利' => '利', '吏' => '吏', '履' => '履', '易' => '易', '李' => '李', '梨' => '梨', '泥' => '泥', '理' => '理', '痢' => '痢', '罹' => '罹', '裏' => '裏', '裡' => '裡', '里' => '里', '離' => '離', '匿' => '匿', '溺' => '溺', '吝' => '吝', '燐' => '燐', '璘' => '璘', '藺' => '藺', '隣' => '隣', '鱗' => '鱗', '麟' => '麟', '林' => '林', '淋' => '淋', '臨' => '臨', '立' => '立', '笠' => '笠', '粒' => '粒', '狀' => '狀', '炙' => '炙', '識' => '識', '什' => '什', '茶' => '茶', '刺' => '刺', '切' => '切', '度' => '度', '拓' => '拓', '糖' => '糖', '宅' => '宅', '洞' => '洞', '暴' => '暴', '輻' => '輻', '行' => '行', '降' => '降', '見' => '見', '廓' => '廓', '兀' => '兀', '嗀' => '嗀', '塚' => '塚', '晴' => '晴', '凞' => '凞', '猪' => '猪', '益' => '益', '礼' => '礼', '神' => '神', '祥' => '祥', '福' => '福', '靖' => '靖', '精' => '精', '羽' => '羽', '蘒' => '蘒', '諸' => '諸', '逸' => '逸', '都' => '都', '飯' => '飯', '飼' => '飼', '館' => '館', '鶴' => '鶴', '郞' => '郞', '隷' => '隷', '侮' => '侮', '僧' => '僧', '免' => '免', '勉' => '勉', '勤' => '勤', '卑' => '卑', '喝' => '喝', '嘆' => '嘆', '器' => '器', '塀' => '塀', '墨' => '墨', '層' => '層', '屮' => '屮', '悔' => '悔', '慨' => '慨', '憎' => '憎', '懲' => '懲', '敏' => '敏', '既' => '既', '暑' => '暑', '梅' => '梅', '海' => '海', '渚' => '渚', '漢' => '漢', '煮' => '煮', '爫' => '爫', '琢' => '琢', '碑' => '碑', '社' => '社', '祉' => '祉', '祈' => '祈', '祐' => '祐', '祖' => '祖', '祝' => '祝', '禍' => '禍', '禎' => '禎', '穀' => '穀', '突' => '突', '節' => '節', '練' => '練', '縉' => '縉', '繁' => '繁', '署' => '署', '者' => '者', '臭' => '臭', '艹' => '艹', '艹' => '艹', '著' => '著', '褐' => '褐', '視' => '視', '謁' => '謁', '謹' => '謹', '賓' => '賓', '贈' => '贈', '辶' => '辶', '逸' => '逸', '難' => '難', '響' => '響', '頻' => '頻', '恵' => '恵', '𤋮' => '𤋮', '舘' => '舘', '並' => '並', '况' => '况', '全' => '全', '侀' => '侀', '充' => '充', '冀' => '冀', '勇' => '勇', '勺' => '勺', '喝' => '喝', '啕' => '啕', '喙' => '喙', '嗢' => '嗢', '塚' => '塚', '墳' => '墳', '奄' => '奄', '奔' => '奔', '婢' => '婢', '嬨' => '嬨', '廒' => '廒', '廙' => '廙', '彩' => '彩', '徭' => '徭', '惘' => '惘', '慎' => '慎', '愈' => '愈', '憎' => '憎', '慠' => '慠', '懲' => '懲', '戴' => '戴', '揄' => '揄', '搜' => '搜', '摒' => '摒', '敖' => '敖', '晴' => '晴', '朗' => '朗', '望' => '望', '杖' => '杖', '歹' => '歹', '殺' => '殺', '流' => '流', '滛' => '滛', '滋' => '滋', '漢' => '漢', '瀞' => '瀞', '煮' => '煮', '瞧' => '瞧', '爵' => '爵', '犯' => '犯', '猪' => '猪', '瑱' => '瑱', '甆' => '甆', '画' => '画', '瘝' => '瘝', '瘟' => '瘟', '益' => '益', '盛' => '盛', '直' => '直', '睊' => '睊', '着' => '着', '磌' => '磌', '窱' => '窱', '節' => '節', '类' => '类', '絛' => '絛', '練' => '練', '缾' => '缾', '者' => '者', '荒' => '荒', '華' => '華', '蝹' => '蝹', '襁' => '襁', '覆' => '覆', '視' => '視', '調' => '調', '諸' => '諸', '請' => '請', '謁' => '謁', '諾' => '諾', '諭' => '諭', '謹' => '謹', '變' => '變', '贈' => '贈', '輸' => '輸', '遲' => '遲', '醙' => '醙', '鉶' => '鉶', '陼' => '陼', '難' => '難', '靖' => '靖', '韛' => '韛', '響' => '響', '頋' => '頋', '頻' => '頻', '鬒' => '鬒', '龜' => '龜', '𢡊' => '𢡊', '𢡄' => '𢡄', '𣏕' => '𣏕', '㮝' => '㮝', '䀘' => '䀘', '䀹' => '䀹', '𥉉' => '𥉉', '𥳐' => '𥳐', '𧻓' => '𧻓', '齃' => '齃', '龎' => '龎', 'יִ' => 'יִ', 'ײַ' => 'ײַ', 'שׁ' => 'שׁ', 'שׂ' => 'שׂ', 'שּׁ' => 'שּׁ', 'שּׂ' => 'שּׂ', 'אַ' => 'אַ', 'אָ' => 'אָ', 'אּ' => 'אּ', 'בּ' => 'בּ', 'גּ' => 'גּ', 'דּ' => 'דּ', 'הּ' => 'הּ', 'וּ' => 'וּ', 'זּ' => 'זּ', 'טּ' => 'טּ', 'יּ' => 'יּ', 'ךּ' => 'ךּ', 'כּ' => 'כּ', 'לּ' => 'לּ', 'מּ' => 'מּ', 'נּ' => 'נּ', 'סּ' => 'סּ', 'ףּ' => 'ףּ', 'פּ' => 'פּ', 'צּ' => 'צּ', 'קּ' => 'קּ', 'רּ' => 'רּ', 'שּ' => 'שּ', 'תּ' => 'תּ', 'וֹ' => 'וֹ', 'בֿ' => 'בֿ', 'כֿ' => 'כֿ', 'פֿ' => 'פֿ', '𑂚' => '𑂚', '𑂜' => '𑂜', '𑂫' => '𑂫', '𑄮' => '𑄮', '𑄯' => '𑄯', '𑍋' => '𑍋', '𑍌' => '𑍌', '𑒻' => '𑒻', '𑒼' => '𑒼', '𑒾' => '𑒾', '𑖺' => '𑖺', '𑖻' => '𑖻', '𑤸' => '𑤸', '𝅗𝅥' => '𝅗𝅥', '𝅘𝅥' => '𝅘𝅥', '𝅘𝅥𝅮' => '𝅘𝅥𝅮', '𝅘𝅥𝅯' => '𝅘𝅥𝅯', '𝅘𝅥𝅰' => '𝅘𝅥𝅰', '𝅘𝅥𝅱' => '𝅘𝅥𝅱', '𝅘𝅥𝅲' => '𝅘𝅥𝅲', '𝆹𝅥' => '𝆹𝅥', '𝆺𝅥' => '𝆺𝅥', '𝆹𝅥𝅮' => '𝆹𝅥𝅮', '𝆺𝅥𝅮' => '𝆺𝅥𝅮', '𝆹𝅥𝅯' => '𝆹𝅥𝅯', '𝆺𝅥𝅯' => '𝆺𝅥𝅯', '丽' => '丽', '丸' => '丸', '乁' => '乁', '𠄢' => '𠄢', '你' => '你', '侮' => '侮', '侻' => '侻', '倂' => '倂', '偺' => '偺', '備' => '備', '僧' => '僧', '像' => '像', '㒞' => '㒞', '𠘺' => '𠘺', '免' => '免', '兔' => '兔', '兤' => '兤', '具' => '具', '𠔜' => '𠔜', '㒹' => '㒹', '內' => '內', '再' => '再', '𠕋' => '𠕋', '冗' => '冗', '冤' => '冤', '仌' => '仌', '冬' => '冬', '况' => '况', '𩇟' => '𩇟', '凵' => '凵', '刃' => '刃', '㓟' => '㓟', '刻' => '刻', '剆' => '剆', '割' => '割', '剷' => '剷', '㔕' => '㔕', '勇' => '勇', '勉' => '勉', '勤' => '勤', '勺' => '勺', '包' => '包', '匆' => '匆', '北' => '北', '卉' => '卉', '卑' => '卑', '博' => '博', '即' => '即', '卽' => '卽', '卿' => '卿', '卿' => '卿', '卿' => '卿', '𠨬' => '𠨬', '灰' => '灰', '及' => '及', '叟' => '叟', '𠭣' => '𠭣', '叫' => '叫', '叱' => '叱', '吆' => '吆', '咞' => '咞', '吸' => '吸', '呈' => '呈', '周' => '周', '咢' => '咢', '哶' => '哶', '唐' => '唐', '啓' => '啓', '啣' => '啣', '善' => '善', '善' => '善', '喙' => '喙', '喫' => '喫', '喳' => '喳', '嗂' => '嗂', '圖' => '圖', '嘆' => '嘆', '圗' => '圗', '噑' => '噑', '噴' => '噴', '切' => '切', '壮' => '壮', '城' => '城', '埴' => '埴', '堍' => '堍', '型' => '型', '堲' => '堲', '報' => '報', '墬' => '墬', '𡓤' => '𡓤', '売' => '売', '壷' => '壷', '夆' => '夆', '多' => '多', '夢' => '夢', '奢' => '奢', '𡚨' => '𡚨', '𡛪' => '𡛪', '姬' => '姬', '娛' => '娛', '娧' => '娧', '姘' => '姘', '婦' => '婦', '㛮' => '㛮', '㛼' => '㛼', '嬈' => '嬈', '嬾' => '嬾', '嬾' => '嬾', '𡧈' => '𡧈', '寃' => '寃', '寘' => '寘', '寧' => '寧', '寳' => '寳', '𡬘' => '𡬘', '寿' => '寿', '将' => '将', '当' => '当', '尢' => '尢', '㞁' => '㞁', '屠' => '屠', '屮' => '屮', '峀' => '峀', '岍' => '岍', '𡷤' => '𡷤', '嵃' => '嵃', '𡷦' => '𡷦', '嵮' => '嵮', '嵫' => '嵫', '嵼' => '嵼', '巡' => '巡', '巢' => '巢', '㠯' => '㠯', '巽' => '巽', '帨' => '帨', '帽' => '帽', '幩' => '幩', '㡢' => '㡢', '𢆃' => '𢆃', '㡼' => '㡼', '庰' => '庰', '庳' => '庳', '庶' => '庶', '廊' => '廊', '𪎒' => '𪎒', '廾' => '廾', '𢌱' => '𢌱', '𢌱' => '𢌱', '舁' => '舁', '弢' => '弢', '弢' => '弢', '㣇' => '㣇', '𣊸' => '𣊸', '𦇚' => '𦇚', '形' => '形', '彫' => '彫', '㣣' => '㣣', '徚' => '徚', '忍' => '忍', '志' => '志', '忹' => '忹', '悁' => '悁', '㤺' => '㤺', '㤜' => '㤜', '悔' => '悔', '𢛔' => '𢛔', '惇' => '惇', '慈' => '慈', '慌' => '慌', '慎' => '慎', '慌' => '慌', '慺' => '慺', '憎' => '憎', '憲' => '憲', '憤' => '憤', '憯' => '憯', '懞' => '懞', '懲' => '懲', '懶' => '懶', '成' => '成', '戛' => '戛', '扝' => '扝', '抱' => '抱', '拔' => '拔', '捐' => '捐', '𢬌' => '𢬌', '挽' => '挽', '拼' => '拼', '捨' => '捨', '掃' => '掃', '揤' => '揤', '𢯱' => '𢯱', '搢' => '搢', '揅' => '揅', '掩' => '掩', '㨮' => '㨮', '摩' => '摩', '摾' => '摾', '撝' => '撝', '摷' => '摷', '㩬' => '㩬', '敏' => '敏', '敬' => '敬', '𣀊' => '𣀊', '旣' => '旣', '書' => '書', '晉' => '晉', '㬙' => '㬙', '暑' => '暑', '㬈' => '㬈', '㫤' => '㫤', '冒' => '冒', '冕' => '冕', '最' => '最', '暜' => '暜', '肭' => '肭', '䏙' => '䏙', '朗' => '朗', '望' => '望', '朡' => '朡', '杞' => '杞', '杓' => '杓', '𣏃' => '𣏃', '㭉' => '㭉', '柺' => '柺', '枅' => '枅', '桒' => '桒', '梅' => '梅', '𣑭' => '𣑭', '梎' => '梎', '栟' => '栟', '椔' => '椔', '㮝' => '㮝', '楂' => '楂', '榣' => '榣', '槪' => '槪', '檨' => '檨', '𣚣' => '𣚣', '櫛' => '櫛', '㰘' => '㰘', '次' => '次', '𣢧' => '𣢧', '歔' => '歔', '㱎' => '㱎', '歲' => '歲', '殟' => '殟', '殺' => '殺', '殻' => '殻', '𣪍' => '𣪍', '𡴋' => '𡴋', '𣫺' => '𣫺', '汎' => '汎', '𣲼' => '𣲼', '沿' => '沿', '泍' => '泍', '汧' => '汧', '洖' => '洖', '派' => '派', '海' => '海', '流' => '流', '浩' => '浩', '浸' => '浸', '涅' => '涅', '𣴞' => '𣴞', '洴' => '洴', '港' => '港', '湮' => '湮', '㴳' => '㴳', '滋' => '滋', '滇' => '滇', '𣻑' => '𣻑', '淹' => '淹', '潮' => '潮', '𣽞' => '𣽞', '𣾎' => '𣾎', '濆' => '濆', '瀹' => '瀹', '瀞' => '瀞', '瀛' => '瀛', '㶖' => '㶖', '灊' => '灊', '災' => '災', '灷' => '灷', '炭' => '炭', '𠔥' => '𠔥', '煅' => '煅', '𤉣' => '𤉣', '熜' => '熜', '𤎫' => '𤎫', '爨' => '爨', '爵' => '爵', '牐' => '牐', '𤘈' => '𤘈', '犀' => '犀', '犕' => '犕', '𤜵' => '𤜵', '𤠔' => '𤠔', '獺' => '獺', '王' => '王', '㺬' => '㺬', '玥' => '玥', '㺸' => '㺸', '㺸' => '㺸', '瑇' => '瑇', '瑜' => '瑜', '瑱' => '瑱', '璅' => '璅', '瓊' => '瓊', '㼛' => '㼛', '甤' => '甤', '𤰶' => '𤰶', '甾' => '甾', '𤲒' => '𤲒', '異' => '異', '𢆟' => '𢆟', '瘐' => '瘐', '𤾡' => '𤾡', '𤾸' => '𤾸', '𥁄' => '𥁄', '㿼' => '㿼', '䀈' => '䀈', '直' => '直', '𥃳' => '𥃳', '𥃲' => '𥃲', '𥄙' => '𥄙', '𥄳' => '𥄳', '眞' => '眞', '真' => '真', '真' => '真', '睊' => '睊', '䀹' => '䀹', '瞋' => '瞋', '䁆' => '䁆', '䂖' => '䂖', '𥐝' => '𥐝', '硎' => '硎', '碌' => '碌', '磌' => '磌', '䃣' => '䃣', '𥘦' => '𥘦', '祖' => '祖', '𥚚' => '𥚚', '𥛅' => '𥛅', '福' => '福', '秫' => '秫', '䄯' => '䄯', '穀' => '穀', '穊' => '穊', '穏' => '穏', '𥥼' => '𥥼', '𥪧' => '𥪧', '𥪧' => '𥪧', '竮' => '竮', '䈂' => '䈂', '𥮫' => '𥮫', '篆' => '篆', '築' => '築', '䈧' => '䈧', '𥲀' => '𥲀', '糒' => '糒', '䊠' => '䊠', '糨' => '糨', '糣' => '糣', '紀' => '紀', '𥾆' => '𥾆', '絣' => '絣', '䌁' => '䌁', '緇' => '緇', '縂' => '縂', '繅' => '繅', '䌴' => '䌴', '𦈨' => '𦈨', '𦉇' => '𦉇', '䍙' => '䍙', '𦋙' => '𦋙', '罺' => '罺', '𦌾' => '𦌾', '羕' => '羕', '翺' => '翺', '者' => '者', '𦓚' => '𦓚', '𦔣' => '𦔣', '聠' => '聠', '𦖨' => '𦖨', '聰' => '聰', '𣍟' => '𣍟', '䏕' => '䏕', '育' => '育', '脃' => '脃', '䐋' => '䐋', '脾' => '脾', '媵' => '媵', '𦞧' => '𦞧', '𦞵' => '𦞵', '𣎓' => '𣎓', '𣎜' => '𣎜', '舁' => '舁', '舄' => '舄', '辞' => '辞', '䑫' => '䑫', '芑' => '芑', '芋' => '芋', '芝' => '芝', '劳' => '劳', '花' => '花', '芳' => '芳', '芽' => '芽', '苦' => '苦', '𦬼' => '𦬼', '若' => '若', '茝' => '茝', '荣' => '荣', '莭' => '莭', '茣' => '茣', '莽' => '莽', '菧' => '菧', '著' => '著', '荓' => '荓', '菊' => '菊', '菌' => '菌', '菜' => '菜', '𦰶' => '𦰶', '𦵫' => '𦵫', '𦳕' => '𦳕', '䔫' => '䔫', '蓱' => '蓱', '蓳' => '蓳', '蔖' => '蔖', '𧏊' => '𧏊', '蕤' => '蕤', '𦼬' => '𦼬', '䕝' => '䕝', '䕡' => '䕡', '𦾱' => '𦾱', '𧃒' => '𧃒', '䕫' => '䕫', '虐' => '虐', '虜' => '虜', '虧' => '虧', '虩' => '虩', '蚩' => '蚩', '蚈' => '蚈', '蜎' => '蜎', '蛢' => '蛢', '蝹' => '蝹', '蜨' => '蜨', '蝫' => '蝫', '螆' => '螆', '䗗' => '䗗', '蟡' => '蟡', '蠁' => '蠁', '䗹' => '䗹', '衠' => '衠', '衣' => '衣', '𧙧' => '𧙧', '裗' => '裗', '裞' => '裞', '䘵' => '䘵', '裺' => '裺', '㒻' => '㒻', '𧢮' => '𧢮', '𧥦' => '𧥦', '䚾' => '䚾', '䛇' => '䛇', '誠' => '誠', '諭' => '諭', '變' => '變', '豕' => '豕', '𧲨' => '𧲨', '貫' => '貫', '賁' => '賁', '贛' => '贛', '起' => '起', '𧼯' => '𧼯', '𠠄' => '𠠄', '跋' => '跋', '趼' => '趼', '跰' => '跰', '𠣞' => '𠣞', '軔' => '軔', '輸' => '輸', '𨗒' => '𨗒', '𨗭' => '𨗭', '邔' => '邔', '郱' => '郱', '鄑' => '鄑', '𨜮' => '𨜮', '鄛' => '鄛', '鈸' => '鈸', '鋗' => '鋗', '鋘' => '鋘', '鉼' => '鉼', '鏹' => '鏹', '鐕' => '鐕', '𨯺' => '𨯺', '開' => '開', '䦕' => '䦕', '閷' => '閷', '𨵷' => '𨵷', '䧦' => '䧦', '雃' => '雃', '嶲' => '嶲', '霣' => '霣', '𩅅' => '𩅅', '𩈚' => '𩈚', '䩮' => '䩮', '䩶' => '䩶', '韠' => '韠', '𩐊' => '𩐊', '䪲' => '䪲', '𩒖' => '𩒖', '頋' => '頋', '頋' => '頋', '頩' => '頩', '𩖶' => '𩖶', '飢' => '飢', '䬳' => '䬳', '餩' => '餩', '馧' => '馧', '駂' => '駂', '駾' => '駾', '䯎' => '䯎', '𩬰' => '𩬰', '鬒' => '鬒', '鱀' => '鱀', '鳽' => '鳽', '䳎' => '䳎', '䳭' => '䳭', '鵧' => '鵧', '𪃎' => '𪃎', '䳸' => '䳸', '𪄅' => '𪄅', '𪈎' => '𪈎', '𪊑' => '𪊑', '麻' => '麻', '䵖' => '䵖', '黹' => '黹', '黾' => '黾', '鼅' => '鼅', '鼏' => '鼏', '鼖' => '鼖', '鼻' => '鼻', '𪘀' => '𪘀'); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php new file mode 100644 index 00000000..4bda386b --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php @@ -0,0 +1,5 @@ + 230, '́' => 230, '̂' => 230, '̃' => 230, '̄' => 230, '̅' => 230, '̆' => 230, '̇' => 230, '̈' => 230, '̉' => 230, '̊' => 230, '̋' => 230, '̌' => 230, '̍' => 230, '̎' => 230, '̏' => 230, '̐' => 230, '̑' => 230, '̒' => 230, '̓' => 230, '̔' => 230, '̕' => 232, '̖' => 220, '̗' => 220, '̘' => 220, '̙' => 220, '̚' => 232, '̛' => 216, '̜' => 220, '̝' => 220, '̞' => 220, '̟' => 220, '̠' => 220, '̡' => 202, '̢' => 202, '̣' => 220, '̤' => 220, '̥' => 220, '̦' => 220, '̧' => 202, '̨' => 202, '̩' => 220, '̪' => 220, '̫' => 220, '̬' => 220, '̭' => 220, '̮' => 220, '̯' => 220, '̰' => 220, '̱' => 220, '̲' => 220, '̳' => 220, '̴' => 1, '̵' => 1, '̶' => 1, '̷' => 1, '̸' => 1, '̹' => 220, '̺' => 220, '̻' => 220, '̼' => 220, '̽' => 230, '̾' => 230, '̿' => 230, '̀' => 230, '́' => 230, '͂' => 230, '̓' => 230, '̈́' => 230, 'ͅ' => 240, '͆' => 230, '͇' => 220, '͈' => 220, '͉' => 220, '͊' => 230, '͋' => 230, '͌' => 230, '͍' => 220, '͎' => 220, '͐' => 230, '͑' => 230, '͒' => 230, '͓' => 220, '͔' => 220, '͕' => 220, '͖' => 220, '͗' => 230, '͘' => 232, '͙' => 220, '͚' => 220, '͛' => 230, '͜' => 233, '͝' => 234, '͞' => 234, '͟' => 233, '͠' => 234, '͡' => 234, '͢' => 233, 'ͣ' => 230, 'ͤ' => 230, 'ͥ' => 230, 'ͦ' => 230, 'ͧ' => 230, 'ͨ' => 230, 'ͩ' => 230, 'ͪ' => 230, 'ͫ' => 230, 'ͬ' => 230, 'ͭ' => 230, 'ͮ' => 230, 'ͯ' => 230, '҃' => 230, '҄' => 230, '҅' => 230, '҆' => 230, '҇' => 230, '֑' => 220, '֒' => 230, '֓' => 230, '֔' => 230, '֕' => 230, '֖' => 220, '֗' => 230, '֘' => 230, '֙' => 230, '֚' => 222, '֛' => 220, '֜' => 230, '֝' => 230, '֞' => 230, '֟' => 230, '֠' => 230, '֡' => 230, '֢' => 220, '֣' => 220, '֤' => 220, '֥' => 220, '֦' => 220, '֧' => 220, '֨' => 230, '֩' => 230, '֪' => 220, '֫' => 230, '֬' => 230, '֭' => 222, '֮' => 228, '֯' => 230, 'ְ' => 10, 'ֱ' => 11, 'ֲ' => 12, 'ֳ' => 13, 'ִ' => 14, 'ֵ' => 15, 'ֶ' => 16, 'ַ' => 17, 'ָ' => 18, 'ֹ' => 19, 'ֺ' => 19, 'ֻ' => 20, 'ּ' => 21, 'ֽ' => 22, 'ֿ' => 23, 'ׁ' => 24, 'ׂ' => 25, 'ׄ' => 230, 'ׅ' => 220, 'ׇ' => 18, 'ؐ' => 230, 'ؑ' => 230, 'ؒ' => 230, 'ؓ' => 230, 'ؔ' => 230, 'ؕ' => 230, 'ؖ' => 230, 'ؗ' => 230, 'ؘ' => 30, 'ؙ' => 31, 'ؚ' => 32, 'ً' => 27, 'ٌ' => 28, 'ٍ' => 29, 'َ' => 30, 'ُ' => 31, 'ِ' => 32, 'ّ' => 33, 'ْ' => 34, 'ٓ' => 230, 'ٔ' => 230, 'ٕ' => 220, 'ٖ' => 220, 'ٗ' => 230, '٘' => 230, 'ٙ' => 230, 'ٚ' => 230, 'ٛ' => 230, 'ٜ' => 220, 'ٝ' => 230, 'ٞ' => 230, 'ٟ' => 220, 'ٰ' => 35, 'ۖ' => 230, 'ۗ' => 230, 'ۘ' => 230, 'ۙ' => 230, 'ۚ' => 230, 'ۛ' => 230, 'ۜ' => 230, '۟' => 230, '۠' => 230, 'ۡ' => 230, 'ۢ' => 230, 'ۣ' => 220, 'ۤ' => 230, 'ۧ' => 230, 'ۨ' => 230, '۪' => 220, '۫' => 230, '۬' => 230, 'ۭ' => 220, 'ܑ' => 36, 'ܰ' => 230, 'ܱ' => 220, 'ܲ' => 230, 'ܳ' => 230, 'ܴ' => 220, 'ܵ' => 230, 'ܶ' => 230, 'ܷ' => 220, 'ܸ' => 220, 'ܹ' => 220, 'ܺ' => 230, 'ܻ' => 220, 'ܼ' => 220, 'ܽ' => 230, 'ܾ' => 220, 'ܿ' => 230, '݀' => 230, '݁' => 230, '݂' => 220, '݃' => 230, '݄' => 220, '݅' => 230, '݆' => 220, '݇' => 230, '݈' => 220, '݉' => 230, '݊' => 230, '߫' => 230, '߬' => 230, '߭' => 230, '߮' => 230, '߯' => 230, '߰' => 230, '߱' => 230, '߲' => 220, '߳' => 230, '߽' => 220, 'ࠖ' => 230, 'ࠗ' => 230, '࠘' => 230, '࠙' => 230, 'ࠛ' => 230, 'ࠜ' => 230, 'ࠝ' => 230, 'ࠞ' => 230, 'ࠟ' => 230, 'ࠠ' => 230, 'ࠡ' => 230, 'ࠢ' => 230, 'ࠣ' => 230, 'ࠥ' => 230, 'ࠦ' => 230, 'ࠧ' => 230, 'ࠩ' => 230, 'ࠪ' => 230, 'ࠫ' => 230, 'ࠬ' => 230, '࠭' => 230, '࡙' => 220, '࡚' => 220, '࡛' => 220, '࣓' => 220, 'ࣔ' => 230, 'ࣕ' => 230, 'ࣖ' => 230, 'ࣗ' => 230, 'ࣘ' => 230, 'ࣙ' => 230, 'ࣚ' => 230, 'ࣛ' => 230, 'ࣜ' => 230, 'ࣝ' => 230, 'ࣞ' => 230, 'ࣟ' => 230, '࣠' => 230, '࣡' => 230, 'ࣣ' => 220, 'ࣤ' => 230, 'ࣥ' => 230, 'ࣦ' => 220, 'ࣧ' => 230, 'ࣨ' => 230, 'ࣩ' => 220, '࣪' => 230, '࣫' => 230, '࣬' => 230, '࣭' => 220, '࣮' => 220, '࣯' => 220, 'ࣰ' => 27, 'ࣱ' => 28, 'ࣲ' => 29, 'ࣳ' => 230, 'ࣴ' => 230, 'ࣵ' => 230, 'ࣶ' => 220, 'ࣷ' => 230, 'ࣸ' => 230, 'ࣹ' => 220, 'ࣺ' => 220, 'ࣻ' => 230, 'ࣼ' => 230, 'ࣽ' => 230, 'ࣾ' => 230, 'ࣿ' => 230, '़' => 7, '्' => 9, '॑' => 230, '॒' => 220, '॓' => 230, '॔' => 230, '়' => 7, '্' => 9, '৾' => 230, '਼' => 7, '੍' => 9, '઼' => 7, '્' => 9, '଼' => 7, '୍' => 9, '்' => 9, '్' => 9, 'ౕ' => 84, 'ౖ' => 91, '಼' => 7, '್' => 9, '഻' => 9, '഼' => 9, '്' => 9, '්' => 9, 'ุ' => 103, 'ู' => 103, 'ฺ' => 9, '่' => 107, '้' => 107, '๊' => 107, '๋' => 107, 'ຸ' => 118, 'ູ' => 118, '຺' => 9, '່' => 122, '້' => 122, '໊' => 122, '໋' => 122, '༘' => 220, '༙' => 220, '༵' => 220, '༷' => 220, '༹' => 216, 'ཱ' => 129, 'ི' => 130, 'ུ' => 132, 'ེ' => 130, 'ཻ' => 130, 'ོ' => 130, 'ཽ' => 130, 'ྀ' => 130, 'ྂ' => 230, 'ྃ' => 230, '྄' => 9, '྆' => 230, '྇' => 230, '࿆' => 220, '့' => 7, '္' => 9, '်' => 9, 'ႍ' => 220, '፝' => 230, '፞' => 230, '፟' => 230, '᜔' => 9, '᜴' => 9, '្' => 9, '៝' => 230, 'ᢩ' => 228, '᤹' => 222, '᤺' => 230, '᤻' => 220, 'ᨗ' => 230, 'ᨘ' => 220, '᩠' => 9, '᩵' => 230, '᩶' => 230, '᩷' => 230, '᩸' => 230, '᩹' => 230, '᩺' => 230, '᩻' => 230, '᩼' => 230, '᩿' => 220, '᪰' => 230, '᪱' => 230, '᪲' => 230, '᪳' => 230, '᪴' => 230, '᪵' => 220, '᪶' => 220, '᪷' => 220, '᪸' => 220, '᪹' => 220, '᪺' => 220, '᪻' => 230, '᪼' => 230, '᪽' => 220, 'ᪿ' => 220, 'ᫀ' => 220, '᬴' => 7, '᭄' => 9, '᭫' => 230, '᭬' => 220, '᭭' => 230, '᭮' => 230, '᭯' => 230, '᭰' => 230, '᭱' => 230, '᭲' => 230, '᭳' => 230, '᮪' => 9, '᮫' => 9, '᯦' => 7, '᯲' => 9, '᯳' => 9, '᰷' => 7, '᳐' => 230, '᳑' => 230, '᳒' => 230, '᳔' => 1, '᳕' => 220, '᳖' => 220, '᳗' => 220, '᳘' => 220, '᳙' => 220, '᳚' => 230, '᳛' => 230, '᳜' => 220, '᳝' => 220, '᳞' => 220, '᳟' => 220, '᳠' => 230, '᳢' => 1, '᳣' => 1, '᳤' => 1, '᳥' => 1, '᳦' => 1, '᳧' => 1, '᳨' => 1, '᳭' => 220, '᳴' => 230, '᳸' => 230, '᳹' => 230, '᷀' => 230, '᷁' => 230, '᷂' => 220, '᷃' => 230, '᷄' => 230, '᷅' => 230, '᷆' => 230, '᷇' => 230, '᷈' => 230, '᷉' => 230, '᷊' => 220, '᷋' => 230, '᷌' => 230, '᷍' => 234, '᷎' => 214, '᷏' => 220, '᷐' => 202, '᷑' => 230, '᷒' => 230, 'ᷓ' => 230, 'ᷔ' => 230, 'ᷕ' => 230, 'ᷖ' => 230, 'ᷗ' => 230, 'ᷘ' => 230, 'ᷙ' => 230, 'ᷚ' => 230, 'ᷛ' => 230, 'ᷜ' => 230, 'ᷝ' => 230, 'ᷞ' => 230, 'ᷟ' => 230, 'ᷠ' => 230, 'ᷡ' => 230, 'ᷢ' => 230, 'ᷣ' => 230, 'ᷤ' => 230, 'ᷥ' => 230, 'ᷦ' => 230, 'ᷧ' => 230, 'ᷨ' => 230, 'ᷩ' => 230, 'ᷪ' => 230, 'ᷫ' => 230, 'ᷬ' => 230, 'ᷭ' => 230, 'ᷮ' => 230, 'ᷯ' => 230, 'ᷰ' => 230, 'ᷱ' => 230, 'ᷲ' => 230, 'ᷳ' => 230, 'ᷴ' => 230, '᷵' => 230, '᷶' => 232, '᷷' => 228, '᷸' => 228, '᷹' => 220, '᷻' => 230, '᷼' => 233, '᷽' => 220, '᷾' => 230, '᷿' => 220, '⃐' => 230, '⃑' => 230, '⃒' => 1, '⃓' => 1, '⃔' => 230, '⃕' => 230, '⃖' => 230, '⃗' => 230, '⃘' => 1, '⃙' => 1, '⃚' => 1, '⃛' => 230, '⃜' => 230, '⃡' => 230, '⃥' => 1, '⃦' => 1, '⃧' => 230, '⃨' => 220, '⃩' => 230, '⃪' => 1, '⃫' => 1, '⃬' => 220, '⃭' => 220, '⃮' => 220, '⃯' => 220, '⃰' => 230, '⳯' => 230, '⳰' => 230, '⳱' => 230, '⵿' => 9, 'ⷠ' => 230, 'ⷡ' => 230, 'ⷢ' => 230, 'ⷣ' => 230, 'ⷤ' => 230, 'ⷥ' => 230, 'ⷦ' => 230, 'ⷧ' => 230, 'ⷨ' => 230, 'ⷩ' => 230, 'ⷪ' => 230, 'ⷫ' => 230, 'ⷬ' => 230, 'ⷭ' => 230, 'ⷮ' => 230, 'ⷯ' => 230, 'ⷰ' => 230, 'ⷱ' => 230, 'ⷲ' => 230, 'ⷳ' => 230, 'ⷴ' => 230, 'ⷵ' => 230, 'ⷶ' => 230, 'ⷷ' => 230, 'ⷸ' => 230, 'ⷹ' => 230, 'ⷺ' => 230, 'ⷻ' => 230, 'ⷼ' => 230, 'ⷽ' => 230, 'ⷾ' => 230, 'ⷿ' => 230, '〪' => 218, '〫' => 228, '〬' => 232, '〭' => 222, '〮' => 224, '〯' => 224, '゙' => 8, '゚' => 8, '꙯' => 230, 'ꙴ' => 230, 'ꙵ' => 230, 'ꙶ' => 230, 'ꙷ' => 230, 'ꙸ' => 230, 'ꙹ' => 230, 'ꙺ' => 230, 'ꙻ' => 230, '꙼' => 230, '꙽' => 230, 'ꚞ' => 230, 'ꚟ' => 230, '꛰' => 230, '꛱' => 230, '꠆' => 9, '꠬' => 9, '꣄' => 9, '꣠' => 230, '꣡' => 230, '꣢' => 230, '꣣' => 230, '꣤' => 230, '꣥' => 230, '꣦' => 230, '꣧' => 230, '꣨' => 230, '꣩' => 230, '꣪' => 230, '꣫' => 230, '꣬' => 230, '꣭' => 230, '꣮' => 230, '꣯' => 230, '꣰' => 230, '꣱' => 230, '꤫' => 220, '꤬' => 220, '꤭' => 220, '꥓' => 9, '꦳' => 7, '꧀' => 9, 'ꪰ' => 230, 'ꪲ' => 230, 'ꪳ' => 230, 'ꪴ' => 220, 'ꪷ' => 230, 'ꪸ' => 230, 'ꪾ' => 230, '꪿' => 230, '꫁' => 230, '꫶' => 9, '꯭' => 9, 'ﬞ' => 26, '︠' => 230, '︡' => 230, '︢' => 230, '︣' => 230, '︤' => 230, '︥' => 230, '︦' => 230, '︧' => 220, '︨' => 220, '︩' => 220, '︪' => 220, '︫' => 220, '︬' => 220, '︭' => 220, '︮' => 230, '︯' => 230, '𐇽' => 220, '𐋠' => 220, '𐍶' => 230, '𐍷' => 230, '𐍸' => 230, '𐍹' => 230, '𐍺' => 230, '𐨍' => 220, '𐨏' => 230, '𐨸' => 230, '𐨹' => 1, '𐨺' => 220, '𐨿' => 9, '𐫥' => 230, '𐫦' => 220, '𐴤' => 230, '𐴥' => 230, '𐴦' => 230, '𐴧' => 230, '𐺫' => 230, '𐺬' => 230, '𐽆' => 220, '𐽇' => 220, '𐽈' => 230, '𐽉' => 230, '𐽊' => 230, '𐽋' => 220, '𐽌' => 230, '𐽍' => 220, '𐽎' => 220, '𐽏' => 220, '𐽐' => 220, '𑁆' => 9, '𑁿' => 9, '𑂹' => 9, '𑂺' => 7, '𑄀' => 230, '𑄁' => 230, '𑄂' => 230, '𑄳' => 9, '𑄴' => 9, '𑅳' => 7, '𑇀' => 9, '𑇊' => 7, '𑈵' => 9, '𑈶' => 7, '𑋩' => 7, '𑋪' => 9, '𑌻' => 7, '𑌼' => 7, '𑍍' => 9, '𑍦' => 230, '𑍧' => 230, '𑍨' => 230, '𑍩' => 230, '𑍪' => 230, '𑍫' => 230, '𑍬' => 230, '𑍰' => 230, '𑍱' => 230, '𑍲' => 230, '𑍳' => 230, '𑍴' => 230, '𑑂' => 9, '𑑆' => 7, '𑑞' => 230, '𑓂' => 9, '𑓃' => 7, '𑖿' => 9, '𑗀' => 7, '𑘿' => 9, '𑚶' => 9, '𑚷' => 7, '𑜫' => 9, '𑠹' => 9, '𑠺' => 7, '𑤽' => 9, '𑤾' => 9, '𑥃' => 7, '𑧠' => 9, '𑨴' => 9, '𑩇' => 9, '𑪙' => 9, '𑰿' => 9, '𑵂' => 7, '𑵄' => 9, '𑵅' => 9, '𑶗' => 9, '𖫰' => 1, '𖫱' => 1, '𖫲' => 1, '𖫳' => 1, '𖫴' => 1, '𖬰' => 230, '𖬱' => 230, '𖬲' => 230, '𖬳' => 230, '𖬴' => 230, '𖬵' => 230, '𖬶' => 230, '𖿰' => 6, '𖿱' => 6, '𛲞' => 1, '𝅥' => 216, '𝅦' => 216, '𝅧' => 1, '𝅨' => 1, '𝅩' => 1, '𝅭' => 226, '𝅮' => 216, '𝅯' => 216, '𝅰' => 216, '𝅱' => 216, '𝅲' => 216, '𝅻' => 220, '𝅼' => 220, '𝅽' => 220, '𝅾' => 220, '𝅿' => 220, '𝆀' => 220, '𝆁' => 220, '𝆂' => 220, '𝆅' => 230, '𝆆' => 230, '𝆇' => 230, '𝆈' => 230, '𝆉' => 230, '𝆊' => 220, '𝆋' => 220, '𝆪' => 230, '𝆫' => 230, '𝆬' => 230, '𝆭' => 230, '𝉂' => 230, '𝉃' => 230, '𝉄' => 230, '𞀀' => 230, '𞀁' => 230, '𞀂' => 230, '𞀃' => 230, '𞀄' => 230, '𞀅' => 230, '𞀆' => 230, '𞀈' => 230, '𞀉' => 230, '𞀊' => 230, '𞀋' => 230, '𞀌' => 230, '𞀍' => 230, '𞀎' => 230, '𞀏' => 230, '𞀐' => 230, '𞀑' => 230, '𞀒' => 230, '𞀓' => 230, '𞀔' => 230, '𞀕' => 230, '𞀖' => 230, '𞀗' => 230, '𞀘' => 230, '𞀛' => 230, '𞀜' => 230, '𞀝' => 230, '𞀞' => 230, '𞀟' => 230, '𞀠' => 230, '𞀡' => 230, '𞀣' => 230, '𞀤' => 230, '𞀦' => 230, '𞀧' => 230, '𞀨' => 230, '𞀩' => 230, '𞀪' => 230, '𞄰' => 230, '𞄱' => 230, '𞄲' => 230, '𞄳' => 230, '𞄴' => 230, '𞄵' => 230, '𞄶' => 230, '𞋬' => 230, '𞋭' => 230, '𞋮' => 230, '𞋯' => 230, '𞣐' => 220, '𞣑' => 220, '𞣒' => 220, '𞣓' => 220, '𞣔' => 220, '𞣕' => 220, '𞣖' => 220, '𞥄' => 230, '𞥅' => 230, '𞥆' => 230, '𞥇' => 230, '𞥈' => 230, '𞥉' => 230, '𞥊' => 7); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php new file mode 100644 index 00000000..94d6cebf --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php @@ -0,0 +1,5 @@ + ' ', '¨' => ' ̈', 'ª' => 'a', '¯' => ' ̄', '²' => '2', '³' => '3', '´' => ' ́', 'µ' => 'μ', '¸' => ' ̧', '¹' => '1', 'º' => 'o', '¼' => '1⁄4', '½' => '1⁄2', '¾' => '3⁄4', 'IJ' => 'IJ', 'ij' => 'ij', 'Ŀ' => 'L·', 'ŀ' => 'l·', 'ʼn' => 'ʼn', 'ſ' => 's', 'DŽ' => 'DŽ', 'Dž' => 'Dž', 'dž' => 'dž', 'LJ' => 'LJ', 'Lj' => 'Lj', 'lj' => 'lj', 'NJ' => 'NJ', 'Nj' => 'Nj', 'nj' => 'nj', 'DZ' => 'DZ', 'Dz' => 'Dz', 'dz' => 'dz', 'ʰ' => 'h', 'ʱ' => 'ɦ', 'ʲ' => 'j', 'ʳ' => 'r', 'ʴ' => 'ɹ', 'ʵ' => 'ɻ', 'ʶ' => 'ʁ', 'ʷ' => 'w', 'ʸ' => 'y', '˘' => ' ̆', '˙' => ' ̇', '˚' => ' ̊', '˛' => ' ̨', '˜' => ' ̃', '˝' => ' ̋', 'ˠ' => 'ɣ', 'ˡ' => 'l', 'ˢ' => 's', 'ˣ' => 'x', 'ˤ' => 'ʕ', 'ͺ' => ' ͅ', '΄' => ' ́', '΅' => ' ̈́', 'ϐ' => 'β', 'ϑ' => 'θ', 'ϒ' => 'Υ', 'ϓ' => 'Ύ', 'ϔ' => 'Ϋ', 'ϕ' => 'φ', 'ϖ' => 'π', 'ϰ' => 'κ', 'ϱ' => 'ρ', 'ϲ' => 'ς', 'ϴ' => 'Θ', 'ϵ' => 'ε', 'Ϲ' => 'Σ', 'և' => 'եւ', 'ٵ' => 'اٴ', 'ٶ' => 'وٴ', 'ٷ' => 'ۇٴ', 'ٸ' => 'يٴ', 'ำ' => 'ํา', 'ຳ' => 'ໍາ', 'ໜ' => 'ຫນ', 'ໝ' => 'ຫມ', '༌' => '་', 'ཷ' => 'ྲཱྀ', 'ཹ' => 'ླཱྀ', 'ჼ' => 'ნ', 'ᴬ' => 'A', 'ᴭ' => 'Æ', 'ᴮ' => 'B', 'ᴰ' => 'D', 'ᴱ' => 'E', 'ᴲ' => 'Ǝ', 'ᴳ' => 'G', 'ᴴ' => 'H', 'ᴵ' => 'I', 'ᴶ' => 'J', 'ᴷ' => 'K', 'ᴸ' => 'L', 'ᴹ' => 'M', 'ᴺ' => 'N', 'ᴼ' => 'O', 'ᴽ' => 'Ȣ', 'ᴾ' => 'P', 'ᴿ' => 'R', 'ᵀ' => 'T', 'ᵁ' => 'U', 'ᵂ' => 'W', 'ᵃ' => 'a', 'ᵄ' => 'ɐ', 'ᵅ' => 'ɑ', 'ᵆ' => 'ᴂ', 'ᵇ' => 'b', 'ᵈ' => 'd', 'ᵉ' => 'e', 'ᵊ' => 'ə', 'ᵋ' => 'ɛ', 'ᵌ' => 'ɜ', 'ᵍ' => 'g', 'ᵏ' => 'k', 'ᵐ' => 'm', 'ᵑ' => 'ŋ', 'ᵒ' => 'o', 'ᵓ' => 'ɔ', 'ᵔ' => 'ᴖ', 'ᵕ' => 'ᴗ', 'ᵖ' => 'p', 'ᵗ' => 't', 'ᵘ' => 'u', 'ᵙ' => 'ᴝ', 'ᵚ' => 'ɯ', 'ᵛ' => 'v', 'ᵜ' => 'ᴥ', 'ᵝ' => 'β', 'ᵞ' => 'γ', 'ᵟ' => 'δ', 'ᵠ' => 'φ', 'ᵡ' => 'χ', 'ᵢ' => 'i', 'ᵣ' => 'r', 'ᵤ' => 'u', 'ᵥ' => 'v', 'ᵦ' => 'β', 'ᵧ' => 'γ', 'ᵨ' => 'ρ', 'ᵩ' => 'φ', 'ᵪ' => 'χ', 'ᵸ' => 'н', 'ᶛ' => 'ɒ', 'ᶜ' => 'c', 'ᶝ' => 'ɕ', 'ᶞ' => 'ð', 'ᶟ' => 'ɜ', 'ᶠ' => 'f', 'ᶡ' => 'ɟ', 'ᶢ' => 'ɡ', 'ᶣ' => 'ɥ', 'ᶤ' => 'ɨ', 'ᶥ' => 'ɩ', 'ᶦ' => 'ɪ', 'ᶧ' => 'ᵻ', 'ᶨ' => 'ʝ', 'ᶩ' => 'ɭ', 'ᶪ' => 'ᶅ', 'ᶫ' => 'ʟ', 'ᶬ' => 'ɱ', 'ᶭ' => 'ɰ', 'ᶮ' => 'ɲ', 'ᶯ' => 'ɳ', 'ᶰ' => 'ɴ', 'ᶱ' => 'ɵ', 'ᶲ' => 'ɸ', 'ᶳ' => 'ʂ', 'ᶴ' => 'ʃ', 'ᶵ' => 'ƫ', 'ᶶ' => 'ʉ', 'ᶷ' => 'ʊ', 'ᶸ' => 'ᴜ', 'ᶹ' => 'ʋ', 'ᶺ' => 'ʌ', 'ᶻ' => 'z', 'ᶼ' => 'ʐ', 'ᶽ' => 'ʑ', 'ᶾ' => 'ʒ', 'ᶿ' => 'θ', 'ẚ' => 'aʾ', 'ẛ' => 'ṡ', '᾽' => ' ̓', '᾿' => ' ̓', '῀' => ' ͂', '῁' => ' ̈͂', '῍' => ' ̓̀', '῎' => ' ̓́', '῏' => ' ̓͂', '῝' => ' ̔̀', '῞' => ' ̔́', '῟' => ' ̔͂', '῭' => ' ̈̀', '΅' => ' ̈́', '´' => ' ́', '῾' => ' ̔', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', '‑' => '‐', '‗' => ' ̳', '․' => '.', '‥' => '..', '…' => '...', ' ' => ' ', '″' => '′′', '‴' => '′′′', '‶' => '‵‵', '‷' => '‵‵‵', '‼' => '!!', '‾' => ' ̅', '⁇' => '??', '⁈' => '?!', '⁉' => '!?', '⁗' => '′′′′', ' ' => ' ', '⁰' => '0', 'ⁱ' => 'i', '⁴' => '4', '⁵' => '5', '⁶' => '6', '⁷' => '7', '⁸' => '8', '⁹' => '9', '⁺' => '+', '⁻' => '−', '⁼' => '=', '⁽' => '(', '⁾' => ')', 'ⁿ' => 'n', '₀' => '0', '₁' => '1', '₂' => '2', '₃' => '3', '₄' => '4', '₅' => '5', '₆' => '6', '₇' => '7', '₈' => '8', '₉' => '9', '₊' => '+', '₋' => '−', '₌' => '=', '₍' => '(', '₎' => ')', 'ₐ' => 'a', 'ₑ' => 'e', 'ₒ' => 'o', 'ₓ' => 'x', 'ₔ' => 'ə', 'ₕ' => 'h', 'ₖ' => 'k', 'ₗ' => 'l', 'ₘ' => 'm', 'ₙ' => 'n', 'ₚ' => 'p', 'ₛ' => 's', 'ₜ' => 't', '₨' => 'Rs', '℀' => 'a/c', '℁' => 'a/s', 'ℂ' => 'C', '℃' => '°C', '℅' => 'c/o', '℆' => 'c/u', 'ℇ' => 'Ɛ', '℉' => '°F', 'ℊ' => 'g', 'ℋ' => 'H', 'ℌ' => 'H', 'ℍ' => 'H', 'ℎ' => 'h', 'ℏ' => 'ħ', 'ℐ' => 'I', 'ℑ' => 'I', 'ℒ' => 'L', 'ℓ' => 'l', 'ℕ' => 'N', '№' => 'No', 'ℙ' => 'P', 'ℚ' => 'Q', 'ℛ' => 'R', 'ℜ' => 'R', 'ℝ' => 'R', '℠' => 'SM', '℡' => 'TEL', '™' => 'TM', 'ℤ' => 'Z', 'ℨ' => 'Z', 'ℬ' => 'B', 'ℭ' => 'C', 'ℯ' => 'e', 'ℰ' => 'E', 'ℱ' => 'F', 'ℳ' => 'M', 'ℴ' => 'o', 'ℵ' => 'א', 'ℶ' => 'ב', 'ℷ' => 'ג', 'ℸ' => 'ד', 'ℹ' => 'i', '℻' => 'FAX', 'ℼ' => 'π', 'ℽ' => 'γ', 'ℾ' => 'Γ', 'ℿ' => 'Π', '⅀' => '∑', 'ⅅ' => 'D', 'ⅆ' => 'd', 'ⅇ' => 'e', 'ⅈ' => 'i', 'ⅉ' => 'j', '⅐' => '1⁄7', '⅑' => '1⁄9', '⅒' => '1⁄10', '⅓' => '1⁄3', '⅔' => '2⁄3', '⅕' => '1⁄5', '⅖' => '2⁄5', '⅗' => '3⁄5', '⅘' => '4⁄5', '⅙' => '1⁄6', '⅚' => '5⁄6', '⅛' => '1⁄8', '⅜' => '3⁄8', '⅝' => '5⁄8', '⅞' => '7⁄8', '⅟' => '1⁄', 'Ⅰ' => 'I', 'Ⅱ' => 'II', 'Ⅲ' => 'III', 'Ⅳ' => 'IV', 'Ⅴ' => 'V', 'Ⅵ' => 'VI', 'Ⅶ' => 'VII', 'Ⅷ' => 'VIII', 'Ⅸ' => 'IX', 'Ⅹ' => 'X', 'Ⅺ' => 'XI', 'Ⅻ' => 'XII', 'Ⅼ' => 'L', 'Ⅽ' => 'C', 'Ⅾ' => 'D', 'Ⅿ' => 'M', 'ⅰ' => 'i', 'ⅱ' => 'ii', 'ⅲ' => 'iii', 'ⅳ' => 'iv', 'ⅴ' => 'v', 'ⅵ' => 'vi', 'ⅶ' => 'vii', 'ⅷ' => 'viii', 'ⅸ' => 'ix', 'ⅹ' => 'x', 'ⅺ' => 'xi', 'ⅻ' => 'xii', 'ⅼ' => 'l', 'ⅽ' => 'c', 'ⅾ' => 'd', 'ⅿ' => 'm', '↉' => '0⁄3', '∬' => '∫∫', '∭' => '∫∫∫', '∯' => '∮∮', '∰' => '∮∮∮', '①' => '1', '②' => '2', '③' => '3', '④' => '4', '⑤' => '5', '⑥' => '6', '⑦' => '7', '⑧' => '8', '⑨' => '9', '⑩' => '10', '⑪' => '11', '⑫' => '12', '⑬' => '13', '⑭' => '14', '⑮' => '15', '⑯' => '16', '⑰' => '17', '⑱' => '18', '⑲' => '19', '⑳' => '20', '⑴' => '(1)', '⑵' => '(2)', '⑶' => '(3)', '⑷' => '(4)', '⑸' => '(5)', '⑹' => '(6)', '⑺' => '(7)', '⑻' => '(8)', '⑼' => '(9)', '⑽' => '(10)', '⑾' => '(11)', '⑿' => '(12)', '⒀' => '(13)', '⒁' => '(14)', '⒂' => '(15)', '⒃' => '(16)', '⒄' => '(17)', '⒅' => '(18)', '⒆' => '(19)', '⒇' => '(20)', '⒈' => '1.', '⒉' => '2.', '⒊' => '3.', '⒋' => '4.', '⒌' => '5.', '⒍' => '6.', '⒎' => '7.', '⒏' => '8.', '⒐' => '9.', '⒑' => '10.', '⒒' => '11.', '⒓' => '12.', '⒔' => '13.', '⒕' => '14.', '⒖' => '15.', '⒗' => '16.', '⒘' => '17.', '⒙' => '18.', '⒚' => '19.', '⒛' => '20.', '⒜' => '(a)', '⒝' => '(b)', '⒞' => '(c)', '⒟' => '(d)', '⒠' => '(e)', '⒡' => '(f)', '⒢' => '(g)', '⒣' => '(h)', '⒤' => '(i)', '⒥' => '(j)', '⒦' => '(k)', '⒧' => '(l)', '⒨' => '(m)', '⒩' => '(n)', '⒪' => '(o)', '⒫' => '(p)', '⒬' => '(q)', '⒭' => '(r)', '⒮' => '(s)', '⒯' => '(t)', '⒰' => '(u)', '⒱' => '(v)', '⒲' => '(w)', '⒳' => '(x)', '⒴' => '(y)', '⒵' => '(z)', 'Ⓐ' => 'A', 'Ⓑ' => 'B', 'Ⓒ' => 'C', 'Ⓓ' => 'D', 'Ⓔ' => 'E', 'Ⓕ' => 'F', 'Ⓖ' => 'G', 'Ⓗ' => 'H', 'Ⓘ' => 'I', 'Ⓙ' => 'J', 'Ⓚ' => 'K', 'Ⓛ' => 'L', 'Ⓜ' => 'M', 'Ⓝ' => 'N', 'Ⓞ' => 'O', 'Ⓟ' => 'P', 'Ⓠ' => 'Q', 'Ⓡ' => 'R', 'Ⓢ' => 'S', 'Ⓣ' => 'T', 'Ⓤ' => 'U', 'Ⓥ' => 'V', 'Ⓦ' => 'W', 'Ⓧ' => 'X', 'Ⓨ' => 'Y', 'Ⓩ' => 'Z', 'ⓐ' => 'a', 'ⓑ' => 'b', 'ⓒ' => 'c', 'ⓓ' => 'd', 'ⓔ' => 'e', 'ⓕ' => 'f', 'ⓖ' => 'g', 'ⓗ' => 'h', 'ⓘ' => 'i', 'ⓙ' => 'j', 'ⓚ' => 'k', 'ⓛ' => 'l', 'ⓜ' => 'm', 'ⓝ' => 'n', 'ⓞ' => 'o', 'ⓟ' => 'p', 'ⓠ' => 'q', 'ⓡ' => 'r', 'ⓢ' => 's', 'ⓣ' => 't', 'ⓤ' => 'u', 'ⓥ' => 'v', 'ⓦ' => 'w', 'ⓧ' => 'x', 'ⓨ' => 'y', 'ⓩ' => 'z', '⓪' => '0', '⨌' => '∫∫∫∫', '⩴' => '::=', '⩵' => '==', '⩶' => '===', 'ⱼ' => 'j', 'ⱽ' => 'V', 'ⵯ' => 'ⵡ', '⺟' => '母', '⻳' => '龟', '⼀' => '一', '⼁' => '丨', '⼂' => '丶', '⼃' => '丿', '⼄' => '乙', '⼅' => '亅', '⼆' => '二', '⼇' => '亠', '⼈' => '人', '⼉' => '儿', '⼊' => '入', '⼋' => '八', '⼌' => '冂', '⼍' => '冖', '⼎' => '冫', '⼏' => '几', '⼐' => '凵', '⼑' => '刀', '⼒' => '力', '⼓' => '勹', '⼔' => '匕', '⼕' => '匚', '⼖' => '匸', '⼗' => '十', '⼘' => '卜', '⼙' => '卩', '⼚' => '厂', '⼛' => '厶', '⼜' => '又', '⼝' => '口', '⼞' => '囗', '⼟' => '土', '⼠' => '士', '⼡' => '夂', '⼢' => '夊', '⼣' => '夕', '⼤' => '大', '⼥' => '女', '⼦' => '子', '⼧' => '宀', '⼨' => '寸', '⼩' => '小', '⼪' => '尢', '⼫' => '尸', '⼬' => '屮', '⼭' => '山', '⼮' => '巛', '⼯' => '工', '⼰' => '己', '⼱' => '巾', '⼲' => '干', '⼳' => '幺', '⼴' => '广', '⼵' => '廴', '⼶' => '廾', '⼷' => '弋', '⼸' => '弓', '⼹' => '彐', '⼺' => '彡', '⼻' => '彳', '⼼' => '心', '⼽' => '戈', '⼾' => '戶', '⼿' => '手', '⽀' => '支', '⽁' => '攴', '⽂' => '文', '⽃' => '斗', '⽄' => '斤', '⽅' => '方', '⽆' => '无', '⽇' => '日', '⽈' => '曰', '⽉' => '月', '⽊' => '木', '⽋' => '欠', '⽌' => '止', '⽍' => '歹', '⽎' => '殳', '⽏' => '毋', '⽐' => '比', '⽑' => '毛', '⽒' => '氏', '⽓' => '气', '⽔' => '水', '⽕' => '火', '⽖' => '爪', '⽗' => '父', '⽘' => '爻', '⽙' => '爿', '⽚' => '片', '⽛' => '牙', '⽜' => '牛', '⽝' => '犬', '⽞' => '玄', '⽟' => '玉', '⽠' => '瓜', '⽡' => '瓦', '⽢' => '甘', '⽣' => '生', '⽤' => '用', '⽥' => '田', '⽦' => '疋', '⽧' => '疒', '⽨' => '癶', '⽩' => '白', '⽪' => '皮', '⽫' => '皿', '⽬' => '目', '⽭' => '矛', '⽮' => '矢', '⽯' => '石', '⽰' => '示', '⽱' => '禸', '⽲' => '禾', '⽳' => '穴', '⽴' => '立', '⽵' => '竹', '⽶' => '米', '⽷' => '糸', '⽸' => '缶', '⽹' => '网', '⽺' => '羊', '⽻' => '羽', '⽼' => '老', '⽽' => '而', '⽾' => '耒', '⽿' => '耳', '⾀' => '聿', '⾁' => '肉', '⾂' => '臣', '⾃' => '自', '⾄' => '至', '⾅' => '臼', '⾆' => '舌', '⾇' => '舛', '⾈' => '舟', '⾉' => '艮', '⾊' => '色', '⾋' => '艸', '⾌' => '虍', '⾍' => '虫', '⾎' => '血', '⾏' => '行', '⾐' => '衣', '⾑' => '襾', '⾒' => '見', '⾓' => '角', '⾔' => '言', '⾕' => '谷', '⾖' => '豆', '⾗' => '豕', '⾘' => '豸', '⾙' => '貝', '⾚' => '赤', '⾛' => '走', '⾜' => '足', '⾝' => '身', '⾞' => '車', '⾟' => '辛', '⾠' => '辰', '⾡' => '辵', '⾢' => '邑', '⾣' => '酉', '⾤' => '釆', '⾥' => '里', '⾦' => '金', '⾧' => '長', '⾨' => '門', '⾩' => '阜', '⾪' => '隶', '⾫' => '隹', '⾬' => '雨', '⾭' => '靑', '⾮' => '非', '⾯' => '面', '⾰' => '革', '⾱' => '韋', '⾲' => '韭', '⾳' => '音', '⾴' => '頁', '⾵' => '風', '⾶' => '飛', '⾷' => '食', '⾸' => '首', '⾹' => '香', '⾺' => '馬', '⾻' => '骨', '⾼' => '高', '⾽' => '髟', '⾾' => '鬥', '⾿' => '鬯', '⿀' => '鬲', '⿁' => '鬼', '⿂' => '魚', '⿃' => '鳥', '⿄' => '鹵', '⿅' => '鹿', '⿆' => '麥', '⿇' => '麻', '⿈' => '黃', '⿉' => '黍', '⿊' => '黑', '⿋' => '黹', '⿌' => '黽', '⿍' => '鼎', '⿎' => '鼓', '⿏' => '鼠', '⿐' => '鼻', '⿑' => '齊', '⿒' => '齒', '⿓' => '龍', '⿔' => '龜', '⿕' => '龠', ' ' => ' ', '〶' => '〒', '〸' => '十', '〹' => '卄', '〺' => '卅', '゛' => ' ゙', '゜' => ' ゚', 'ゟ' => 'より', 'ヿ' => 'コト', 'ㄱ' => 'ᄀ', 'ㄲ' => 'ᄁ', 'ㄳ' => 'ᆪ', 'ㄴ' => 'ᄂ', 'ㄵ' => 'ᆬ', 'ㄶ' => 'ᆭ', 'ㄷ' => 'ᄃ', 'ㄸ' => 'ᄄ', 'ㄹ' => 'ᄅ', 'ㄺ' => 'ᆰ', 'ㄻ' => 'ᆱ', 'ㄼ' => 'ᆲ', 'ㄽ' => 'ᆳ', 'ㄾ' => 'ᆴ', 'ㄿ' => 'ᆵ', 'ㅀ' => 'ᄚ', 'ㅁ' => 'ᄆ', 'ㅂ' => 'ᄇ', 'ㅃ' => 'ᄈ', 'ㅄ' => 'ᄡ', 'ㅅ' => 'ᄉ', 'ㅆ' => 'ᄊ', 'ㅇ' => 'ᄋ', 'ㅈ' => 'ᄌ', 'ㅉ' => 'ᄍ', 'ㅊ' => 'ᄎ', 'ㅋ' => 'ᄏ', 'ㅌ' => 'ᄐ', 'ㅍ' => 'ᄑ', 'ㅎ' => 'ᄒ', 'ㅏ' => 'ᅡ', 'ㅐ' => 'ᅢ', 'ㅑ' => 'ᅣ', 'ㅒ' => 'ᅤ', 'ㅓ' => 'ᅥ', 'ㅔ' => 'ᅦ', 'ㅕ' => 'ᅧ', 'ㅖ' => 'ᅨ', 'ㅗ' => 'ᅩ', 'ㅘ' => 'ᅪ', 'ㅙ' => 'ᅫ', 'ㅚ' => 'ᅬ', 'ㅛ' => 'ᅭ', 'ㅜ' => 'ᅮ', 'ㅝ' => 'ᅯ', 'ㅞ' => 'ᅰ', 'ㅟ' => 'ᅱ', 'ㅠ' => 'ᅲ', 'ㅡ' => 'ᅳ', 'ㅢ' => 'ᅴ', 'ㅣ' => 'ᅵ', 'ㅤ' => 'ᅠ', 'ㅥ' => 'ᄔ', 'ㅦ' => 'ᄕ', 'ㅧ' => 'ᇇ', 'ㅨ' => 'ᇈ', 'ㅩ' => 'ᇌ', 'ㅪ' => 'ᇎ', 'ㅫ' => 'ᇓ', 'ㅬ' => 'ᇗ', 'ㅭ' => 'ᇙ', 'ㅮ' => 'ᄜ', 'ㅯ' => 'ᇝ', 'ㅰ' => 'ᇟ', 'ㅱ' => 'ᄝ', 'ㅲ' => 'ᄞ', 'ㅳ' => 'ᄠ', 'ㅴ' => 'ᄢ', 'ㅵ' => 'ᄣ', 'ㅶ' => 'ᄧ', 'ㅷ' => 'ᄩ', 'ㅸ' => 'ᄫ', 'ㅹ' => 'ᄬ', 'ㅺ' => 'ᄭ', 'ㅻ' => 'ᄮ', 'ㅼ' => 'ᄯ', 'ㅽ' => 'ᄲ', 'ㅾ' => 'ᄶ', 'ㅿ' => 'ᅀ', 'ㆀ' => 'ᅇ', 'ㆁ' => 'ᅌ', 'ㆂ' => 'ᇱ', 'ㆃ' => 'ᇲ', 'ㆄ' => 'ᅗ', 'ㆅ' => 'ᅘ', 'ㆆ' => 'ᅙ', 'ㆇ' => 'ᆄ', 'ㆈ' => 'ᆅ', 'ㆉ' => 'ᆈ', 'ㆊ' => 'ᆑ', 'ㆋ' => 'ᆒ', 'ㆌ' => 'ᆔ', 'ㆍ' => 'ᆞ', 'ㆎ' => 'ᆡ', '㆒' => '一', '㆓' => '二', '㆔' => '三', '㆕' => '四', '㆖' => '上', '㆗' => '中', '㆘' => '下', '㆙' => '甲', '㆚' => '乙', '㆛' => '丙', '㆜' => '丁', '㆝' => '天', '㆞' => '地', '㆟' => '人', '㈀' => '(ᄀ)', '㈁' => '(ᄂ)', '㈂' => '(ᄃ)', '㈃' => '(ᄅ)', '㈄' => '(ᄆ)', '㈅' => '(ᄇ)', '㈆' => '(ᄉ)', '㈇' => '(ᄋ)', '㈈' => '(ᄌ)', '㈉' => '(ᄎ)', '㈊' => '(ᄏ)', '㈋' => '(ᄐ)', '㈌' => '(ᄑ)', '㈍' => '(ᄒ)', '㈎' => '(가)', '㈏' => '(나)', '㈐' => '(다)', '㈑' => '(라)', '㈒' => '(마)', '㈓' => '(바)', '㈔' => '(사)', '㈕' => '(아)', '㈖' => '(자)', '㈗' => '(차)', '㈘' => '(카)', '㈙' => '(타)', '㈚' => '(파)', '㈛' => '(하)', '㈜' => '(주)', '㈝' => '(오전)', '㈞' => '(오후)', '㈠' => '(一)', '㈡' => '(二)', '㈢' => '(三)', '㈣' => '(四)', '㈤' => '(五)', '㈥' => '(六)', '㈦' => '(七)', '㈧' => '(八)', '㈨' => '(九)', '㈩' => '(十)', '㈪' => '(月)', '㈫' => '(火)', '㈬' => '(水)', '㈭' => '(木)', '㈮' => '(金)', '㈯' => '(土)', '㈰' => '(日)', '㈱' => '(株)', '㈲' => '(有)', '㈳' => '(社)', '㈴' => '(名)', '㈵' => '(特)', '㈶' => '(財)', '㈷' => '(祝)', '㈸' => '(労)', '㈹' => '(代)', '㈺' => '(呼)', '㈻' => '(学)', '㈼' => '(監)', '㈽' => '(企)', '㈾' => '(資)', '㈿' => '(協)', '㉀' => '(祭)', '㉁' => '(休)', '㉂' => '(自)', '㉃' => '(至)', '㉄' => '問', '㉅' => '幼', '㉆' => '文', '㉇' => '箏', '㉐' => 'PTE', '㉑' => '21', '㉒' => '22', '㉓' => '23', '㉔' => '24', '㉕' => '25', '㉖' => '26', '㉗' => '27', '㉘' => '28', '㉙' => '29', '㉚' => '30', '㉛' => '31', '㉜' => '32', '㉝' => '33', '㉞' => '34', '㉟' => '35', '㉠' => 'ᄀ', '㉡' => 'ᄂ', '㉢' => 'ᄃ', '㉣' => 'ᄅ', '㉤' => 'ᄆ', '㉥' => 'ᄇ', '㉦' => 'ᄉ', '㉧' => 'ᄋ', '㉨' => 'ᄌ', '㉩' => 'ᄎ', '㉪' => 'ᄏ', '㉫' => 'ᄐ', '㉬' => 'ᄑ', '㉭' => 'ᄒ', '㉮' => '가', '㉯' => '나', '㉰' => '다', '㉱' => '라', '㉲' => '마', '㉳' => '바', '㉴' => '사', '㉵' => '아', '㉶' => '자', '㉷' => '차', '㉸' => '카', '㉹' => '타', '㉺' => '파', '㉻' => '하', '㉼' => '참고', '㉽' => '주의', '㉾' => '우', '㊀' => '一', '㊁' => '二', '㊂' => '三', '㊃' => '四', '㊄' => '五', '㊅' => '六', '㊆' => '七', '㊇' => '八', '㊈' => '九', '㊉' => '十', '㊊' => '月', '㊋' => '火', '㊌' => '水', '㊍' => '木', '㊎' => '金', '㊏' => '土', '㊐' => '日', '㊑' => '株', '㊒' => '有', '㊓' => '社', '㊔' => '名', '㊕' => '特', '㊖' => '財', '㊗' => '祝', '㊘' => '労', '㊙' => '秘', '㊚' => '男', '㊛' => '女', '㊜' => '適', '㊝' => '優', '㊞' => '印', '㊟' => '注', '㊠' => '項', '㊡' => '休', '㊢' => '写', '㊣' => '正', '㊤' => '上', '㊥' => '中', '㊦' => '下', '㊧' => '左', '㊨' => '右', '㊩' => '医', '㊪' => '宗', '㊫' => '学', '㊬' => '監', '㊭' => '企', '㊮' => '資', '㊯' => '協', '㊰' => '夜', '㊱' => '36', '㊲' => '37', '㊳' => '38', '㊴' => '39', '㊵' => '40', '㊶' => '41', '㊷' => '42', '㊸' => '43', '㊹' => '44', '㊺' => '45', '㊻' => '46', '㊼' => '47', '㊽' => '48', '㊾' => '49', '㊿' => '50', '㋀' => '1月', '㋁' => '2月', '㋂' => '3月', '㋃' => '4月', '㋄' => '5月', '㋅' => '6月', '㋆' => '7月', '㋇' => '8月', '㋈' => '9月', '㋉' => '10月', '㋊' => '11月', '㋋' => '12月', '㋌' => 'Hg', '㋍' => 'erg', '㋎' => 'eV', '㋏' => 'LTD', '㋐' => 'ア', '㋑' => 'イ', '㋒' => 'ウ', '㋓' => 'エ', '㋔' => 'オ', '㋕' => 'カ', '㋖' => 'キ', '㋗' => 'ク', '㋘' => 'ケ', '㋙' => 'コ', '㋚' => 'サ', '㋛' => 'シ', '㋜' => 'ス', '㋝' => 'セ', '㋞' => 'ソ', '㋟' => 'タ', '㋠' => 'チ', '㋡' => 'ツ', '㋢' => 'テ', '㋣' => 'ト', '㋤' => 'ナ', '㋥' => 'ニ', '㋦' => 'ヌ', '㋧' => 'ネ', '㋨' => 'ノ', '㋩' => 'ハ', '㋪' => 'ヒ', '㋫' => 'フ', '㋬' => 'ヘ', '㋭' => 'ホ', '㋮' => 'マ', '㋯' => 'ミ', '㋰' => 'ム', '㋱' => 'メ', '㋲' => 'モ', '㋳' => 'ヤ', '㋴' => 'ユ', '㋵' => 'ヨ', '㋶' => 'ラ', '㋷' => 'リ', '㋸' => 'ル', '㋹' => 'レ', '㋺' => 'ロ', '㋻' => 'ワ', '㋼' => 'ヰ', '㋽' => 'ヱ', '㋾' => 'ヲ', '㋿' => '令和', '㌀' => 'アパート', '㌁' => 'アルファ', '㌂' => 'アンペア', '㌃' => 'アール', '㌄' => 'イニング', '㌅' => 'インチ', '㌆' => 'ウォン', '㌇' => 'エスクード', '㌈' => 'エーカー', '㌉' => 'オンス', '㌊' => 'オーム', '㌋' => 'カイリ', '㌌' => 'カラット', '㌍' => 'カロリー', '㌎' => 'ガロン', '㌏' => 'ガンマ', '㌐' => 'ギガ', '㌑' => 'ギニー', '㌒' => 'キュリー', '㌓' => 'ギルダー', '㌔' => 'キロ', '㌕' => 'キログラム', '㌖' => 'キロメートル', '㌗' => 'キロワット', '㌘' => 'グラム', '㌙' => 'グラムトン', '㌚' => 'クルゼイロ', '㌛' => 'クローネ', '㌜' => 'ケース', '㌝' => 'コルナ', '㌞' => 'コーポ', '㌟' => 'サイクル', '㌠' => 'サンチーム', '㌡' => 'シリング', '㌢' => 'センチ', '㌣' => 'セント', '㌤' => 'ダース', '㌥' => 'デシ', '㌦' => 'ドル', '㌧' => 'トン', '㌨' => 'ナノ', '㌩' => 'ノット', '㌪' => 'ハイツ', '㌫' => 'パーセント', '㌬' => 'パーツ', '㌭' => 'バーレル', '㌮' => 'ピアストル', '㌯' => 'ピクル', '㌰' => 'ピコ', '㌱' => 'ビル', '㌲' => 'ファラッド', '㌳' => 'フィート', '㌴' => 'ブッシェル', '㌵' => 'フラン', '㌶' => 'ヘクタール', '㌷' => 'ペソ', '㌸' => 'ペニヒ', '㌹' => 'ヘルツ', '㌺' => 'ペンス', '㌻' => 'ページ', '㌼' => 'ベータ', '㌽' => 'ポイント', '㌾' => 'ボルト', '㌿' => 'ホン', '㍀' => 'ポンド', '㍁' => 'ホール', '㍂' => 'ホーン', '㍃' => 'マイクロ', '㍄' => 'マイル', '㍅' => 'マッハ', '㍆' => 'マルク', '㍇' => 'マンション', '㍈' => 'ミクロン', '㍉' => 'ミリ', '㍊' => 'ミリバール', '㍋' => 'メガ', '㍌' => 'メガトン', '㍍' => 'メートル', '㍎' => 'ヤード', '㍏' => 'ヤール', '㍐' => 'ユアン', '㍑' => 'リットル', '㍒' => 'リラ', '㍓' => 'ルピー', '㍔' => 'ルーブル', '㍕' => 'レム', '㍖' => 'レントゲン', '㍗' => 'ワット', '㍘' => '0点', '㍙' => '1点', '㍚' => '2点', '㍛' => '3点', '㍜' => '4点', '㍝' => '5点', '㍞' => '6点', '㍟' => '7点', '㍠' => '8点', '㍡' => '9点', '㍢' => '10点', '㍣' => '11点', '㍤' => '12点', '㍥' => '13点', '㍦' => '14点', '㍧' => '15点', '㍨' => '16点', '㍩' => '17点', '㍪' => '18点', '㍫' => '19点', '㍬' => '20点', '㍭' => '21点', '㍮' => '22点', '㍯' => '23点', '㍰' => '24点', '㍱' => 'hPa', '㍲' => 'da', '㍳' => 'AU', '㍴' => 'bar', '㍵' => 'oV', '㍶' => 'pc', '㍷' => 'dm', '㍸' => 'dm2', '㍹' => 'dm3', '㍺' => 'IU', '㍻' => '平成', '㍼' => '昭和', '㍽' => '大正', '㍾' => '明治', '㍿' => '株式会社', '㎀' => 'pA', '㎁' => 'nA', '㎂' => 'μA', '㎃' => 'mA', '㎄' => 'kA', '㎅' => 'KB', '㎆' => 'MB', '㎇' => 'GB', '㎈' => 'cal', '㎉' => 'kcal', '㎊' => 'pF', '㎋' => 'nF', '㎌' => 'μF', '㎍' => 'μg', '㎎' => 'mg', '㎏' => 'kg', '㎐' => 'Hz', '㎑' => 'kHz', '㎒' => 'MHz', '㎓' => 'GHz', '㎔' => 'THz', '㎕' => 'μl', '㎖' => 'ml', '㎗' => 'dl', '㎘' => 'kl', '㎙' => 'fm', '㎚' => 'nm', '㎛' => 'μm', '㎜' => 'mm', '㎝' => 'cm', '㎞' => 'km', '㎟' => 'mm2', '㎠' => 'cm2', '㎡' => 'm2', '㎢' => 'km2', '㎣' => 'mm3', '㎤' => 'cm3', '㎥' => 'm3', '㎦' => 'km3', '㎧' => 'm∕s', '㎨' => 'm∕s2', '㎩' => 'Pa', '㎪' => 'kPa', '㎫' => 'MPa', '㎬' => 'GPa', '㎭' => 'rad', '㎮' => 'rad∕s', '㎯' => 'rad∕s2', '㎰' => 'ps', '㎱' => 'ns', '㎲' => 'μs', '㎳' => 'ms', '㎴' => 'pV', '㎵' => 'nV', '㎶' => 'μV', '㎷' => 'mV', '㎸' => 'kV', '㎹' => 'MV', '㎺' => 'pW', '㎻' => 'nW', '㎼' => 'μW', '㎽' => 'mW', '㎾' => 'kW', '㎿' => 'MW', '㏀' => 'kΩ', '㏁' => 'MΩ', '㏂' => 'a.m.', '㏃' => 'Bq', '㏄' => 'cc', '㏅' => 'cd', '㏆' => 'C∕kg', '㏇' => 'Co.', '㏈' => 'dB', '㏉' => 'Gy', '㏊' => 'ha', '㏋' => 'HP', '㏌' => 'in', '㏍' => 'KK', '㏎' => 'KM', '㏏' => 'kt', '㏐' => 'lm', '㏑' => 'ln', '㏒' => 'log', '㏓' => 'lx', '㏔' => 'mb', '㏕' => 'mil', '㏖' => 'mol', '㏗' => 'PH', '㏘' => 'p.m.', '㏙' => 'PPM', '㏚' => 'PR', '㏛' => 'sr', '㏜' => 'Sv', '㏝' => 'Wb', '㏞' => 'V∕m', '㏟' => 'A∕m', '㏠' => '1日', '㏡' => '2日', '㏢' => '3日', '㏣' => '4日', '㏤' => '5日', '㏥' => '6日', '㏦' => '7日', '㏧' => '8日', '㏨' => '9日', '㏩' => '10日', '㏪' => '11日', '㏫' => '12日', '㏬' => '13日', '㏭' => '14日', '㏮' => '15日', '㏯' => '16日', '㏰' => '17日', '㏱' => '18日', '㏲' => '19日', '㏳' => '20日', '㏴' => '21日', '㏵' => '22日', '㏶' => '23日', '㏷' => '24日', '㏸' => '25日', '㏹' => '26日', '㏺' => '27日', '㏻' => '28日', '㏼' => '29日', '㏽' => '30日', '㏾' => '31日', '㏿' => 'gal', 'ꚜ' => 'ъ', 'ꚝ' => 'ь', 'ꝰ' => 'ꝯ', 'ꟸ' => 'Ħ', 'ꟹ' => 'œ', 'ꭜ' => 'ꜧ', 'ꭝ' => 'ꬷ', 'ꭞ' => 'ɫ', 'ꭟ' => 'ꭒ', 'ꭩ' => 'ʍ', 'ff' => 'ff', 'fi' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'մն', 'ﬔ' => 'մե', 'ﬕ' => 'մի', 'ﬖ' => 'վն', 'ﬗ' => 'մխ', 'ﬠ' => 'ע', 'ﬡ' => 'א', 'ﬢ' => 'ד', 'ﬣ' => 'ה', 'ﬤ' => 'כ', 'ﬥ' => 'ל', 'ﬦ' => 'ם', 'ﬧ' => 'ר', 'ﬨ' => 'ת', '﬩' => '+', 'ﭏ' => 'אל', 'ﭐ' => 'ٱ', 'ﭑ' => 'ٱ', 'ﭒ' => 'ٻ', 'ﭓ' => 'ٻ', 'ﭔ' => 'ٻ', 'ﭕ' => 'ٻ', 'ﭖ' => 'پ', 'ﭗ' => 'پ', 'ﭘ' => 'پ', 'ﭙ' => 'پ', 'ﭚ' => 'ڀ', 'ﭛ' => 'ڀ', 'ﭜ' => 'ڀ', 'ﭝ' => 'ڀ', 'ﭞ' => 'ٺ', 'ﭟ' => 'ٺ', 'ﭠ' => 'ٺ', 'ﭡ' => 'ٺ', 'ﭢ' => 'ٿ', 'ﭣ' => 'ٿ', 'ﭤ' => 'ٿ', 'ﭥ' => 'ٿ', 'ﭦ' => 'ٹ', 'ﭧ' => 'ٹ', 'ﭨ' => 'ٹ', 'ﭩ' => 'ٹ', 'ﭪ' => 'ڤ', 'ﭫ' => 'ڤ', 'ﭬ' => 'ڤ', 'ﭭ' => 'ڤ', 'ﭮ' => 'ڦ', 'ﭯ' => 'ڦ', 'ﭰ' => 'ڦ', 'ﭱ' => 'ڦ', 'ﭲ' => 'ڄ', 'ﭳ' => 'ڄ', 'ﭴ' => 'ڄ', 'ﭵ' => 'ڄ', 'ﭶ' => 'ڃ', 'ﭷ' => 'ڃ', 'ﭸ' => 'ڃ', 'ﭹ' => 'ڃ', 'ﭺ' => 'چ', 'ﭻ' => 'چ', 'ﭼ' => 'چ', 'ﭽ' => 'چ', 'ﭾ' => 'ڇ', 'ﭿ' => 'ڇ', 'ﮀ' => 'ڇ', 'ﮁ' => 'ڇ', 'ﮂ' => 'ڍ', 'ﮃ' => 'ڍ', 'ﮄ' => 'ڌ', 'ﮅ' => 'ڌ', 'ﮆ' => 'ڎ', 'ﮇ' => 'ڎ', 'ﮈ' => 'ڈ', 'ﮉ' => 'ڈ', 'ﮊ' => 'ژ', 'ﮋ' => 'ژ', 'ﮌ' => 'ڑ', 'ﮍ' => 'ڑ', 'ﮎ' => 'ک', 'ﮏ' => 'ک', 'ﮐ' => 'ک', 'ﮑ' => 'ک', 'ﮒ' => 'گ', 'ﮓ' => 'گ', 'ﮔ' => 'گ', 'ﮕ' => 'گ', 'ﮖ' => 'ڳ', 'ﮗ' => 'ڳ', 'ﮘ' => 'ڳ', 'ﮙ' => 'ڳ', 'ﮚ' => 'ڱ', 'ﮛ' => 'ڱ', 'ﮜ' => 'ڱ', 'ﮝ' => 'ڱ', 'ﮞ' => 'ں', 'ﮟ' => 'ں', 'ﮠ' => 'ڻ', 'ﮡ' => 'ڻ', 'ﮢ' => 'ڻ', 'ﮣ' => 'ڻ', 'ﮤ' => 'ۀ', 'ﮥ' => 'ۀ', 'ﮦ' => 'ہ', 'ﮧ' => 'ہ', 'ﮨ' => 'ہ', 'ﮩ' => 'ہ', 'ﮪ' => 'ھ', 'ﮫ' => 'ھ', 'ﮬ' => 'ھ', 'ﮭ' => 'ھ', 'ﮮ' => 'ے', 'ﮯ' => 'ے', 'ﮰ' => 'ۓ', 'ﮱ' => 'ۓ', 'ﯓ' => 'ڭ', 'ﯔ' => 'ڭ', 'ﯕ' => 'ڭ', 'ﯖ' => 'ڭ', 'ﯗ' => 'ۇ', 'ﯘ' => 'ۇ', 'ﯙ' => 'ۆ', 'ﯚ' => 'ۆ', 'ﯛ' => 'ۈ', 'ﯜ' => 'ۈ', 'ﯝ' => 'ۇٴ', 'ﯞ' => 'ۋ', 'ﯟ' => 'ۋ', 'ﯠ' => 'ۅ', 'ﯡ' => 'ۅ', 'ﯢ' => 'ۉ', 'ﯣ' => 'ۉ', 'ﯤ' => 'ې', 'ﯥ' => 'ې', 'ﯦ' => 'ې', 'ﯧ' => 'ې', 'ﯨ' => 'ى', 'ﯩ' => 'ى', 'ﯪ' => 'ئا', 'ﯫ' => 'ئا', 'ﯬ' => 'ئە', 'ﯭ' => 'ئە', 'ﯮ' => 'ئو', 'ﯯ' => 'ئو', 'ﯰ' => 'ئۇ', 'ﯱ' => 'ئۇ', 'ﯲ' => 'ئۆ', 'ﯳ' => 'ئۆ', 'ﯴ' => 'ئۈ', 'ﯵ' => 'ئۈ', 'ﯶ' => 'ئې', 'ﯷ' => 'ئې', 'ﯸ' => 'ئې', 'ﯹ' => 'ئى', 'ﯺ' => 'ئى', 'ﯻ' => 'ئى', 'ﯼ' => 'ی', 'ﯽ' => 'ی', 'ﯾ' => 'ی', 'ﯿ' => 'ی', 'ﰀ' => 'ئج', 'ﰁ' => 'ئح', 'ﰂ' => 'ئم', 'ﰃ' => 'ئى', 'ﰄ' => 'ئي', 'ﰅ' => 'بج', 'ﰆ' => 'بح', 'ﰇ' => 'بخ', 'ﰈ' => 'بم', 'ﰉ' => 'بى', 'ﰊ' => 'بي', 'ﰋ' => 'تج', 'ﰌ' => 'تح', 'ﰍ' => 'تخ', 'ﰎ' => 'تم', 'ﰏ' => 'تى', 'ﰐ' => 'تي', 'ﰑ' => 'ثج', 'ﰒ' => 'ثم', 'ﰓ' => 'ثى', 'ﰔ' => 'ثي', 'ﰕ' => 'جح', 'ﰖ' => 'جم', 'ﰗ' => 'حج', 'ﰘ' => 'حم', 'ﰙ' => 'خج', 'ﰚ' => 'خح', 'ﰛ' => 'خم', 'ﰜ' => 'سج', 'ﰝ' => 'سح', 'ﰞ' => 'سخ', 'ﰟ' => 'سم', 'ﰠ' => 'صح', 'ﰡ' => 'صم', 'ﰢ' => 'ضج', 'ﰣ' => 'ضح', 'ﰤ' => 'ضخ', 'ﰥ' => 'ضم', 'ﰦ' => 'طح', 'ﰧ' => 'طم', 'ﰨ' => 'ظم', 'ﰩ' => 'عج', 'ﰪ' => 'عم', 'ﰫ' => 'غج', 'ﰬ' => 'غم', 'ﰭ' => 'فج', 'ﰮ' => 'فح', 'ﰯ' => 'فخ', 'ﰰ' => 'فم', 'ﰱ' => 'فى', 'ﰲ' => 'في', 'ﰳ' => 'قح', 'ﰴ' => 'قم', 'ﰵ' => 'قى', 'ﰶ' => 'قي', 'ﰷ' => 'كا', 'ﰸ' => 'كج', 'ﰹ' => 'كح', 'ﰺ' => 'كخ', 'ﰻ' => 'كل', 'ﰼ' => 'كم', 'ﰽ' => 'كى', 'ﰾ' => 'كي', 'ﰿ' => 'لج', 'ﱀ' => 'لح', 'ﱁ' => 'لخ', 'ﱂ' => 'لم', 'ﱃ' => 'لى', 'ﱄ' => 'لي', 'ﱅ' => 'مج', 'ﱆ' => 'مح', 'ﱇ' => 'مخ', 'ﱈ' => 'مم', 'ﱉ' => 'مى', 'ﱊ' => 'مي', 'ﱋ' => 'نج', 'ﱌ' => 'نح', 'ﱍ' => 'نخ', 'ﱎ' => 'نم', 'ﱏ' => 'نى', 'ﱐ' => 'ني', 'ﱑ' => 'هج', 'ﱒ' => 'هم', 'ﱓ' => 'هى', 'ﱔ' => 'هي', 'ﱕ' => 'يج', 'ﱖ' => 'يح', 'ﱗ' => 'يخ', 'ﱘ' => 'يم', 'ﱙ' => 'يى', 'ﱚ' => 'يي', 'ﱛ' => 'ذٰ', 'ﱜ' => 'رٰ', 'ﱝ' => 'ىٰ', 'ﱞ' => ' ٌّ', 'ﱟ' => ' ٍّ', 'ﱠ' => ' َّ', 'ﱡ' => ' ُّ', 'ﱢ' => ' ِّ', 'ﱣ' => ' ّٰ', 'ﱤ' => 'ئر', 'ﱥ' => 'ئز', 'ﱦ' => 'ئم', 'ﱧ' => 'ئن', 'ﱨ' => 'ئى', 'ﱩ' => 'ئي', 'ﱪ' => 'بر', 'ﱫ' => 'بز', 'ﱬ' => 'بم', 'ﱭ' => 'بن', 'ﱮ' => 'بى', 'ﱯ' => 'بي', 'ﱰ' => 'تر', 'ﱱ' => 'تز', 'ﱲ' => 'تم', 'ﱳ' => 'تن', 'ﱴ' => 'تى', 'ﱵ' => 'تي', 'ﱶ' => 'ثر', 'ﱷ' => 'ثز', 'ﱸ' => 'ثم', 'ﱹ' => 'ثن', 'ﱺ' => 'ثى', 'ﱻ' => 'ثي', 'ﱼ' => 'فى', 'ﱽ' => 'في', 'ﱾ' => 'قى', 'ﱿ' => 'قي', 'ﲀ' => 'كا', 'ﲁ' => 'كل', 'ﲂ' => 'كم', 'ﲃ' => 'كى', 'ﲄ' => 'كي', 'ﲅ' => 'لم', 'ﲆ' => 'لى', 'ﲇ' => 'لي', 'ﲈ' => 'ما', 'ﲉ' => 'مم', 'ﲊ' => 'نر', 'ﲋ' => 'نز', 'ﲌ' => 'نم', 'ﲍ' => 'نن', 'ﲎ' => 'نى', 'ﲏ' => 'ني', 'ﲐ' => 'ىٰ', 'ﲑ' => 'ير', 'ﲒ' => 'يز', 'ﲓ' => 'يم', 'ﲔ' => 'ين', 'ﲕ' => 'يى', 'ﲖ' => 'يي', 'ﲗ' => 'ئج', 'ﲘ' => 'ئح', 'ﲙ' => 'ئخ', 'ﲚ' => 'ئم', 'ﲛ' => 'ئه', 'ﲜ' => 'بج', 'ﲝ' => 'بح', 'ﲞ' => 'بخ', 'ﲟ' => 'بم', 'ﲠ' => 'به', 'ﲡ' => 'تج', 'ﲢ' => 'تح', 'ﲣ' => 'تخ', 'ﲤ' => 'تم', 'ﲥ' => 'ته', 'ﲦ' => 'ثم', 'ﲧ' => 'جح', 'ﲨ' => 'جم', 'ﲩ' => 'حج', 'ﲪ' => 'حم', 'ﲫ' => 'خج', 'ﲬ' => 'خم', 'ﲭ' => 'سج', 'ﲮ' => 'سح', 'ﲯ' => 'سخ', 'ﲰ' => 'سم', 'ﲱ' => 'صح', 'ﲲ' => 'صخ', 'ﲳ' => 'صم', 'ﲴ' => 'ضج', 'ﲵ' => 'ضح', 'ﲶ' => 'ضخ', 'ﲷ' => 'ضم', 'ﲸ' => 'طح', 'ﲹ' => 'ظم', 'ﲺ' => 'عج', 'ﲻ' => 'عم', 'ﲼ' => 'غج', 'ﲽ' => 'غم', 'ﲾ' => 'فج', 'ﲿ' => 'فح', 'ﳀ' => 'فخ', 'ﳁ' => 'فم', 'ﳂ' => 'قح', 'ﳃ' => 'قم', 'ﳄ' => 'كج', 'ﳅ' => 'كح', 'ﳆ' => 'كخ', 'ﳇ' => 'كل', 'ﳈ' => 'كم', 'ﳉ' => 'لج', 'ﳊ' => 'لح', 'ﳋ' => 'لخ', 'ﳌ' => 'لم', 'ﳍ' => 'له', 'ﳎ' => 'مج', 'ﳏ' => 'مح', 'ﳐ' => 'مخ', 'ﳑ' => 'مم', 'ﳒ' => 'نج', 'ﳓ' => 'نح', 'ﳔ' => 'نخ', 'ﳕ' => 'نم', 'ﳖ' => 'نه', 'ﳗ' => 'هج', 'ﳘ' => 'هم', 'ﳙ' => 'هٰ', 'ﳚ' => 'يج', 'ﳛ' => 'يح', 'ﳜ' => 'يخ', 'ﳝ' => 'يم', 'ﳞ' => 'يه', 'ﳟ' => 'ئم', 'ﳠ' => 'ئه', 'ﳡ' => 'بم', 'ﳢ' => 'به', 'ﳣ' => 'تم', 'ﳤ' => 'ته', 'ﳥ' => 'ثم', 'ﳦ' => 'ثه', 'ﳧ' => 'سم', 'ﳨ' => 'سه', 'ﳩ' => 'شم', 'ﳪ' => 'شه', 'ﳫ' => 'كل', 'ﳬ' => 'كم', 'ﳭ' => 'لم', 'ﳮ' => 'نم', 'ﳯ' => 'نه', 'ﳰ' => 'يم', 'ﳱ' => 'يه', 'ﳲ' => 'ـَّ', 'ﳳ' => 'ـُّ', 'ﳴ' => 'ـِّ', 'ﳵ' => 'طى', 'ﳶ' => 'طي', 'ﳷ' => 'عى', 'ﳸ' => 'عي', 'ﳹ' => 'غى', 'ﳺ' => 'غي', 'ﳻ' => 'سى', 'ﳼ' => 'سي', 'ﳽ' => 'شى', 'ﳾ' => 'شي', 'ﳿ' => 'حى', 'ﴀ' => 'حي', 'ﴁ' => 'جى', 'ﴂ' => 'جي', 'ﴃ' => 'خى', 'ﴄ' => 'خي', 'ﴅ' => 'صى', 'ﴆ' => 'صي', 'ﴇ' => 'ضى', 'ﴈ' => 'ضي', 'ﴉ' => 'شج', 'ﴊ' => 'شح', 'ﴋ' => 'شخ', 'ﴌ' => 'شم', 'ﴍ' => 'شر', 'ﴎ' => 'سر', 'ﴏ' => 'صر', 'ﴐ' => 'ضر', 'ﴑ' => 'طى', 'ﴒ' => 'طي', 'ﴓ' => 'عى', 'ﴔ' => 'عي', 'ﴕ' => 'غى', 'ﴖ' => 'غي', 'ﴗ' => 'سى', 'ﴘ' => 'سي', 'ﴙ' => 'شى', 'ﴚ' => 'شي', 'ﴛ' => 'حى', 'ﴜ' => 'حي', 'ﴝ' => 'جى', 'ﴞ' => 'جي', 'ﴟ' => 'خى', 'ﴠ' => 'خي', 'ﴡ' => 'صى', 'ﴢ' => 'صي', 'ﴣ' => 'ضى', 'ﴤ' => 'ضي', 'ﴥ' => 'شج', 'ﴦ' => 'شح', 'ﴧ' => 'شخ', 'ﴨ' => 'شم', 'ﴩ' => 'شر', 'ﴪ' => 'سر', 'ﴫ' => 'صر', 'ﴬ' => 'ضر', 'ﴭ' => 'شج', 'ﴮ' => 'شح', 'ﴯ' => 'شخ', 'ﴰ' => 'شم', 'ﴱ' => 'سه', 'ﴲ' => 'شه', 'ﴳ' => 'طم', 'ﴴ' => 'سج', 'ﴵ' => 'سح', 'ﴶ' => 'سخ', 'ﴷ' => 'شج', 'ﴸ' => 'شح', 'ﴹ' => 'شخ', 'ﴺ' => 'طم', 'ﴻ' => 'ظم', 'ﴼ' => 'اً', 'ﴽ' => 'اً', 'ﵐ' => 'تجم', 'ﵑ' => 'تحج', 'ﵒ' => 'تحج', 'ﵓ' => 'تحم', 'ﵔ' => 'تخم', 'ﵕ' => 'تمج', 'ﵖ' => 'تمح', 'ﵗ' => 'تمخ', 'ﵘ' => 'جمح', 'ﵙ' => 'جمح', 'ﵚ' => 'حمي', 'ﵛ' => 'حمى', 'ﵜ' => 'سحج', 'ﵝ' => 'سجح', 'ﵞ' => 'سجى', 'ﵟ' => 'سمح', 'ﵠ' => 'سمح', 'ﵡ' => 'سمج', 'ﵢ' => 'سمم', 'ﵣ' => 'سمم', 'ﵤ' => 'صحح', 'ﵥ' => 'صحح', 'ﵦ' => 'صمم', 'ﵧ' => 'شحم', 'ﵨ' => 'شحم', 'ﵩ' => 'شجي', 'ﵪ' => 'شمخ', 'ﵫ' => 'شمخ', 'ﵬ' => 'شمم', 'ﵭ' => 'شمم', 'ﵮ' => 'ضحى', 'ﵯ' => 'ضخم', 'ﵰ' => 'ضخم', 'ﵱ' => 'طمح', 'ﵲ' => 'طمح', 'ﵳ' => 'طمم', 'ﵴ' => 'طمي', 'ﵵ' => 'عجم', 'ﵶ' => 'عمم', 'ﵷ' => 'عمم', 'ﵸ' => 'عمى', 'ﵹ' => 'غمم', 'ﵺ' => 'غمي', 'ﵻ' => 'غمى', 'ﵼ' => 'فخم', 'ﵽ' => 'فخم', 'ﵾ' => 'قمح', 'ﵿ' => 'قمم', 'ﶀ' => 'لحم', 'ﶁ' => 'لحي', 'ﶂ' => 'لحى', 'ﶃ' => 'لجج', 'ﶄ' => 'لجج', 'ﶅ' => 'لخم', 'ﶆ' => 'لخم', 'ﶇ' => 'لمح', 'ﶈ' => 'لمح', 'ﶉ' => 'محج', 'ﶊ' => 'محم', 'ﶋ' => 'محي', 'ﶌ' => 'مجح', 'ﶍ' => 'مجم', 'ﶎ' => 'مخج', 'ﶏ' => 'مخم', 'ﶒ' => 'مجخ', 'ﶓ' => 'همج', 'ﶔ' => 'همم', 'ﶕ' => 'نحم', 'ﶖ' => 'نحى', 'ﶗ' => 'نجم', 'ﶘ' => 'نجم', 'ﶙ' => 'نجى', 'ﶚ' => 'نمي', 'ﶛ' => 'نمى', 'ﶜ' => 'يمم', 'ﶝ' => 'يمم', 'ﶞ' => 'بخي', 'ﶟ' => 'تجي', 'ﶠ' => 'تجى', 'ﶡ' => 'تخي', 'ﶢ' => 'تخى', 'ﶣ' => 'تمي', 'ﶤ' => 'تمى', 'ﶥ' => 'جمي', 'ﶦ' => 'جحى', 'ﶧ' => 'جمى', 'ﶨ' => 'سخى', 'ﶩ' => 'صحي', 'ﶪ' => 'شحي', 'ﶫ' => 'ضحي', 'ﶬ' => 'لجي', 'ﶭ' => 'لمي', 'ﶮ' => 'يحي', 'ﶯ' => 'يجي', 'ﶰ' => 'يمي', 'ﶱ' => 'ممي', 'ﶲ' => 'قمي', 'ﶳ' => 'نحي', 'ﶴ' => 'قمح', 'ﶵ' => 'لحم', 'ﶶ' => 'عمي', 'ﶷ' => 'كمي', 'ﶸ' => 'نجح', 'ﶹ' => 'مخي', 'ﶺ' => 'لجم', 'ﶻ' => 'كمم', 'ﶼ' => 'لجم', 'ﶽ' => 'نجح', 'ﶾ' => 'جحي', 'ﶿ' => 'حجي', 'ﷀ' => 'مجي', 'ﷁ' => 'فمي', 'ﷂ' => 'بحي', 'ﷃ' => 'كمم', 'ﷄ' => 'عجم', 'ﷅ' => 'صمم', 'ﷆ' => 'سخي', 'ﷇ' => 'نجي', 'ﷰ' => 'صلے', 'ﷱ' => 'قلے', 'ﷲ' => 'الله', 'ﷳ' => 'اكبر', 'ﷴ' => 'محمد', 'ﷵ' => 'صلعم', 'ﷶ' => 'رسول', 'ﷷ' => 'عليه', 'ﷸ' => 'وسلم', 'ﷹ' => 'صلى', 'ﷺ' => 'صلى الله عليه وسلم', 'ﷻ' => 'جل جلاله', '﷼' => 'ریال', '︐' => ',', '︑' => '、', '︒' => '。', '︓' => ':', '︔' => ';', '︕' => '!', '︖' => '?', '︗' => '〖', '︘' => '〗', '︙' => '...', '︰' => '..', '︱' => '—', '︲' => '–', '︳' => '_', '︴' => '_', '︵' => '(', '︶' => ')', '︷' => '{', '︸' => '}', '︹' => '〔', '︺' => '〕', '︻' => '【', '︼' => '】', '︽' => '《', '︾' => '》', '︿' => '〈', '﹀' => '〉', '﹁' => '「', '﹂' => '」', '﹃' => '『', '﹄' => '』', '﹇' => '[', '﹈' => ']', '﹉' => ' ̅', '﹊' => ' ̅', '﹋' => ' ̅', '﹌' => ' ̅', '﹍' => '_', '﹎' => '_', '﹏' => '_', '﹐' => ',', '﹑' => '、', '﹒' => '.', '﹔' => ';', '﹕' => ':', '﹖' => '?', '﹗' => '!', '﹘' => '—', '﹙' => '(', '﹚' => ')', '﹛' => '{', '﹜' => '}', '﹝' => '〔', '﹞' => '〕', '﹟' => '#', '﹠' => '&', '﹡' => '*', '﹢' => '+', '﹣' => '-', '﹤' => '<', '﹥' => '>', '﹦' => '=', '﹨' => '\\', '﹩' => '$', '﹪' => '%', '﹫' => '@', 'ﹰ' => ' ً', 'ﹱ' => 'ـً', 'ﹲ' => ' ٌ', 'ﹴ' => ' ٍ', 'ﹶ' => ' َ', 'ﹷ' => 'ـَ', 'ﹸ' => ' ُ', 'ﹹ' => 'ـُ', 'ﹺ' => ' ِ', 'ﹻ' => 'ـِ', 'ﹼ' => ' ّ', 'ﹽ' => 'ـّ', 'ﹾ' => ' ْ', 'ﹿ' => 'ـْ', 'ﺀ' => 'ء', 'ﺁ' => 'آ', 'ﺂ' => 'آ', 'ﺃ' => 'أ', 'ﺄ' => 'أ', 'ﺅ' => 'ؤ', 'ﺆ' => 'ؤ', 'ﺇ' => 'إ', 'ﺈ' => 'إ', 'ﺉ' => 'ئ', 'ﺊ' => 'ئ', 'ﺋ' => 'ئ', 'ﺌ' => 'ئ', 'ﺍ' => 'ا', 'ﺎ' => 'ا', 'ﺏ' => 'ب', 'ﺐ' => 'ب', 'ﺑ' => 'ب', 'ﺒ' => 'ب', 'ﺓ' => 'ة', 'ﺔ' => 'ة', 'ﺕ' => 'ت', 'ﺖ' => 'ت', 'ﺗ' => 'ت', 'ﺘ' => 'ت', 'ﺙ' => 'ث', 'ﺚ' => 'ث', 'ﺛ' => 'ث', 'ﺜ' => 'ث', 'ﺝ' => 'ج', 'ﺞ' => 'ج', 'ﺟ' => 'ج', 'ﺠ' => 'ج', 'ﺡ' => 'ح', 'ﺢ' => 'ح', 'ﺣ' => 'ح', 'ﺤ' => 'ح', 'ﺥ' => 'خ', 'ﺦ' => 'خ', 'ﺧ' => 'خ', 'ﺨ' => 'خ', 'ﺩ' => 'د', 'ﺪ' => 'د', 'ﺫ' => 'ذ', 'ﺬ' => 'ذ', 'ﺭ' => 'ر', 'ﺮ' => 'ر', 'ﺯ' => 'ز', 'ﺰ' => 'ز', 'ﺱ' => 'س', 'ﺲ' => 'س', 'ﺳ' => 'س', 'ﺴ' => 'س', 'ﺵ' => 'ش', 'ﺶ' => 'ش', 'ﺷ' => 'ش', 'ﺸ' => 'ش', 'ﺹ' => 'ص', 'ﺺ' => 'ص', 'ﺻ' => 'ص', 'ﺼ' => 'ص', 'ﺽ' => 'ض', 'ﺾ' => 'ض', 'ﺿ' => 'ض', 'ﻀ' => 'ض', 'ﻁ' => 'ط', 'ﻂ' => 'ط', 'ﻃ' => 'ط', 'ﻄ' => 'ط', 'ﻅ' => 'ظ', 'ﻆ' => 'ظ', 'ﻇ' => 'ظ', 'ﻈ' => 'ظ', 'ﻉ' => 'ع', 'ﻊ' => 'ع', 'ﻋ' => 'ع', 'ﻌ' => 'ع', 'ﻍ' => 'غ', 'ﻎ' => 'غ', 'ﻏ' => 'غ', 'ﻐ' => 'غ', 'ﻑ' => 'ف', 'ﻒ' => 'ف', 'ﻓ' => 'ف', 'ﻔ' => 'ف', 'ﻕ' => 'ق', 'ﻖ' => 'ق', 'ﻗ' => 'ق', 'ﻘ' => 'ق', 'ﻙ' => 'ك', 'ﻚ' => 'ك', 'ﻛ' => 'ك', 'ﻜ' => 'ك', 'ﻝ' => 'ل', 'ﻞ' => 'ل', 'ﻟ' => 'ل', 'ﻠ' => 'ل', 'ﻡ' => 'م', 'ﻢ' => 'م', 'ﻣ' => 'م', 'ﻤ' => 'م', 'ﻥ' => 'ن', 'ﻦ' => 'ن', 'ﻧ' => 'ن', 'ﻨ' => 'ن', 'ﻩ' => 'ه', 'ﻪ' => 'ه', 'ﻫ' => 'ه', 'ﻬ' => 'ه', 'ﻭ' => 'و', 'ﻮ' => 'و', 'ﻯ' => 'ى', 'ﻰ' => 'ى', 'ﻱ' => 'ي', 'ﻲ' => 'ي', 'ﻳ' => 'ي', 'ﻴ' => 'ي', 'ﻵ' => 'لآ', 'ﻶ' => 'لآ', 'ﻷ' => 'لأ', 'ﻸ' => 'لأ', 'ﻹ' => 'لإ', 'ﻺ' => 'لإ', 'ﻻ' => 'لا', 'ﻼ' => 'لا', '!' => '!', '"' => '"', '#' => '#', '$' => '$', '%' => '%', '&' => '&', ''' => '\'', '(' => '(', ')' => ')', '*' => '*', '+' => '+', ',' => ',', '-' => '-', '.' => '.', '/' => '/', '0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', ':' => ':', ';' => ';', '<' => '<', '=' => '=', '>' => '>', '?' => '?', '@' => '@', 'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E', 'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O', 'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T', 'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y', 'Z' => 'Z', '[' => '[', '\' => '\\', ']' => ']', '^' => '^', '_' => '_', '`' => '`', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 'y' => 'y', 'z' => 'z', '{' => '{', '|' => '|', '}' => '}', '~' => '~', '⦅' => '⦅', '⦆' => '⦆', '。' => '。', '「' => '「', '」' => '」', '、' => '、', '・' => '・', 'ヲ' => 'ヲ', 'ァ' => 'ァ', 'ィ' => 'ィ', 'ゥ' => 'ゥ', 'ェ' => 'ェ', 'ォ' => 'ォ', 'ャ' => 'ャ', 'ュ' => 'ュ', 'ョ' => 'ョ', 'ッ' => 'ッ', 'ー' => 'ー', 'ア' => 'ア', 'イ' => 'イ', 'ウ' => 'ウ', 'エ' => 'エ', 'オ' => 'オ', 'カ' => 'カ', 'キ' => 'キ', 'ク' => 'ク', 'ケ' => 'ケ', 'コ' => 'コ', 'サ' => 'サ', 'シ' => 'シ', 'ス' => 'ス', 'セ' => 'セ', 'ソ' => 'ソ', 'タ' => 'タ', 'チ' => 'チ', 'ツ' => 'ツ', 'テ' => 'テ', 'ト' => 'ト', 'ナ' => 'ナ', 'ニ' => 'ニ', 'ヌ' => 'ヌ', 'ネ' => 'ネ', 'ノ' => 'ノ', 'ハ' => 'ハ', 'ヒ' => 'ヒ', 'フ' => 'フ', 'ヘ' => 'ヘ', 'ホ' => 'ホ', 'マ' => 'マ', 'ミ' => 'ミ', 'ム' => 'ム', 'メ' => 'メ', 'モ' => 'モ', 'ヤ' => 'ヤ', 'ユ' => 'ユ', 'ヨ' => 'ヨ', 'ラ' => 'ラ', 'リ' => 'リ', 'ル' => 'ル', 'レ' => 'レ', 'ロ' => 'ロ', 'ワ' => 'ワ', 'ン' => 'ン', '゙' => '゙', '゚' => '゚', 'ᅠ' => 'ᅠ', 'ᄀ' => 'ᄀ', 'ᄁ' => 'ᄁ', 'ᆪ' => 'ᆪ', 'ᄂ' => 'ᄂ', 'ᆬ' => 'ᆬ', 'ᆭ' => 'ᆭ', 'ᄃ' => 'ᄃ', 'ᄄ' => 'ᄄ', 'ᄅ' => 'ᄅ', 'ᆰ' => 'ᆰ', 'ᆱ' => 'ᆱ', 'ᆲ' => 'ᆲ', 'ᆳ' => 'ᆳ', 'ᆴ' => 'ᆴ', 'ᆵ' => 'ᆵ', 'ᄚ' => 'ᄚ', 'ᄆ' => 'ᄆ', 'ᄇ' => 'ᄇ', 'ᄈ' => 'ᄈ', 'ᄡ' => 'ᄡ', 'ᄉ' => 'ᄉ', 'ᄊ' => 'ᄊ', 'ᄋ' => 'ᄋ', 'ᄌ' => 'ᄌ', 'ᄍ' => 'ᄍ', 'ᄎ' => 'ᄎ', 'ᄏ' => 'ᄏ', 'ᄐ' => 'ᄐ', 'ᄑ' => 'ᄑ', 'ᄒ' => 'ᄒ', 'ᅡ' => 'ᅡ', 'ᅢ' => 'ᅢ', 'ᅣ' => 'ᅣ', 'ᅤ' => 'ᅤ', 'ᅥ' => 'ᅥ', 'ᅦ' => 'ᅦ', 'ᅧ' => 'ᅧ', 'ᅨ' => 'ᅨ', 'ᅩ' => 'ᅩ', 'ᅪ' => 'ᅪ', 'ᅫ' => 'ᅫ', 'ᅬ' => 'ᅬ', 'ᅭ' => 'ᅭ', 'ᅮ' => 'ᅮ', 'ᅯ' => 'ᅯ', 'ᅰ' => 'ᅰ', 'ᅱ' => 'ᅱ', 'ᅲ' => 'ᅲ', 'ᅳ' => 'ᅳ', 'ᅴ' => 'ᅴ', 'ᅵ' => 'ᅵ', '¢' => '¢', '£' => '£', '¬' => '¬', ' ̄' => ' ̄', '¦' => '¦', '¥' => '¥', '₩' => '₩', '│' => '│', '←' => '←', '↑' => '↑', '→' => '→', '↓' => '↓', '■' => '■', '○' => '○', '𝐀' => 'A', '𝐁' => 'B', '𝐂' => 'C', '𝐃' => 'D', '𝐄' => 'E', '𝐅' => 'F', '𝐆' => 'G', '𝐇' => 'H', '𝐈' => 'I', '𝐉' => 'J', '𝐊' => 'K', '𝐋' => 'L', '𝐌' => 'M', '𝐍' => 'N', '𝐎' => 'O', '𝐏' => 'P', '𝐐' => 'Q', '𝐑' => 'R', '𝐒' => 'S', '𝐓' => 'T', '𝐔' => 'U', '𝐕' => 'V', '𝐖' => 'W', '𝐗' => 'X', '𝐘' => 'Y', '𝐙' => 'Z', '𝐚' => 'a', '𝐛' => 'b', '𝐜' => 'c', '𝐝' => 'd', '𝐞' => 'e', '𝐟' => 'f', '𝐠' => 'g', '𝐡' => 'h', '𝐢' => 'i', '𝐣' => 'j', '𝐤' => 'k', '𝐥' => 'l', '𝐦' => 'm', '𝐧' => 'n', '𝐨' => 'o', '𝐩' => 'p', '𝐪' => 'q', '𝐫' => 'r', '𝐬' => 's', '𝐭' => 't', '𝐮' => 'u', '𝐯' => 'v', '𝐰' => 'w', '𝐱' => 'x', '𝐲' => 'y', '𝐳' => 'z', '𝐴' => 'A', '𝐵' => 'B', '𝐶' => 'C', '𝐷' => 'D', '𝐸' => 'E', '𝐹' => 'F', '𝐺' => 'G', '𝐻' => 'H', '𝐼' => 'I', '𝐽' => 'J', '𝐾' => 'K', '𝐿' => 'L', '𝑀' => 'M', '𝑁' => 'N', '𝑂' => 'O', '𝑃' => 'P', '𝑄' => 'Q', '𝑅' => 'R', '𝑆' => 'S', '𝑇' => 'T', '𝑈' => 'U', '𝑉' => 'V', '𝑊' => 'W', '𝑋' => 'X', '𝑌' => 'Y', '𝑍' => 'Z', '𝑎' => 'a', '𝑏' => 'b', '𝑐' => 'c', '𝑑' => 'd', '𝑒' => 'e', '𝑓' => 'f', '𝑔' => 'g', '𝑖' => 'i', '𝑗' => 'j', '𝑘' => 'k', '𝑙' => 'l', '𝑚' => 'm', '𝑛' => 'n', '𝑜' => 'o', '𝑝' => 'p', '𝑞' => 'q', '𝑟' => 'r', '𝑠' => 's', '𝑡' => 't', '𝑢' => 'u', '𝑣' => 'v', '𝑤' => 'w', '𝑥' => 'x', '𝑦' => 'y', '𝑧' => 'z', '𝑨' => 'A', '𝑩' => 'B', '𝑪' => 'C', '𝑫' => 'D', '𝑬' => 'E', '𝑭' => 'F', '𝑮' => 'G', '𝑯' => 'H', '𝑰' => 'I', '𝑱' => 'J', '𝑲' => 'K', '𝑳' => 'L', '𝑴' => 'M', '𝑵' => 'N', '𝑶' => 'O', '𝑷' => 'P', '𝑸' => 'Q', '𝑹' => 'R', '𝑺' => 'S', '𝑻' => 'T', '𝑼' => 'U', '𝑽' => 'V', '𝑾' => 'W', '𝑿' => 'X', '𝒀' => 'Y', '𝒁' => 'Z', '𝒂' => 'a', '𝒃' => 'b', '𝒄' => 'c', '𝒅' => 'd', '𝒆' => 'e', '𝒇' => 'f', '𝒈' => 'g', '𝒉' => 'h', '𝒊' => 'i', '𝒋' => 'j', '𝒌' => 'k', '𝒍' => 'l', '𝒎' => 'm', '𝒏' => 'n', '𝒐' => 'o', '𝒑' => 'p', '𝒒' => 'q', '𝒓' => 'r', '𝒔' => 's', '𝒕' => 't', '𝒖' => 'u', '𝒗' => 'v', '𝒘' => 'w', '𝒙' => 'x', '𝒚' => 'y', '𝒛' => 'z', '𝒜' => 'A', '𝒞' => 'C', '𝒟' => 'D', '𝒢' => 'G', '𝒥' => 'J', '𝒦' => 'K', '𝒩' => 'N', '𝒪' => 'O', '𝒫' => 'P', '𝒬' => 'Q', '𝒮' => 'S', '𝒯' => 'T', '𝒰' => 'U', '𝒱' => 'V', '𝒲' => 'W', '𝒳' => 'X', '𝒴' => 'Y', '𝒵' => 'Z', '𝒶' => 'a', '𝒷' => 'b', '𝒸' => 'c', '𝒹' => 'd', '𝒻' => 'f', '𝒽' => 'h', '𝒾' => 'i', '𝒿' => 'j', '𝓀' => 'k', '𝓁' => 'l', '𝓂' => 'm', '𝓃' => 'n', '𝓅' => 'p', '𝓆' => 'q', '𝓇' => 'r', '𝓈' => 's', '𝓉' => 't', '𝓊' => 'u', '𝓋' => 'v', '𝓌' => 'w', '𝓍' => 'x', '𝓎' => 'y', '𝓏' => 'z', '𝓐' => 'A', '𝓑' => 'B', '𝓒' => 'C', '𝓓' => 'D', '𝓔' => 'E', '𝓕' => 'F', '𝓖' => 'G', '𝓗' => 'H', '𝓘' => 'I', '𝓙' => 'J', '𝓚' => 'K', '𝓛' => 'L', '𝓜' => 'M', '𝓝' => 'N', '𝓞' => 'O', '𝓟' => 'P', '𝓠' => 'Q', '𝓡' => 'R', '𝓢' => 'S', '𝓣' => 'T', '𝓤' => 'U', '𝓥' => 'V', '𝓦' => 'W', '𝓧' => 'X', '𝓨' => 'Y', '𝓩' => 'Z', '𝓪' => 'a', '𝓫' => 'b', '𝓬' => 'c', '𝓭' => 'd', '𝓮' => 'e', '𝓯' => 'f', '𝓰' => 'g', '𝓱' => 'h', '𝓲' => 'i', '𝓳' => 'j', '𝓴' => 'k', '𝓵' => 'l', '𝓶' => 'm', '𝓷' => 'n', '𝓸' => 'o', '𝓹' => 'p', '𝓺' => 'q', '𝓻' => 'r', '𝓼' => 's', '𝓽' => 't', '𝓾' => 'u', '𝓿' => 'v', '𝔀' => 'w', '𝔁' => 'x', '𝔂' => 'y', '𝔃' => 'z', '𝔄' => 'A', '𝔅' => 'B', '𝔇' => 'D', '𝔈' => 'E', '𝔉' => 'F', '𝔊' => 'G', '𝔍' => 'J', '𝔎' => 'K', '𝔏' => 'L', '𝔐' => 'M', '𝔑' => 'N', '𝔒' => 'O', '𝔓' => 'P', '𝔔' => 'Q', '𝔖' => 'S', '𝔗' => 'T', '𝔘' => 'U', '𝔙' => 'V', '𝔚' => 'W', '𝔛' => 'X', '𝔜' => 'Y', '𝔞' => 'a', '𝔟' => 'b', '𝔠' => 'c', '𝔡' => 'd', '𝔢' => 'e', '𝔣' => 'f', '𝔤' => 'g', '𝔥' => 'h', '𝔦' => 'i', '𝔧' => 'j', '𝔨' => 'k', '𝔩' => 'l', '𝔪' => 'm', '𝔫' => 'n', '𝔬' => 'o', '𝔭' => 'p', '𝔮' => 'q', '𝔯' => 'r', '𝔰' => 's', '𝔱' => 't', '𝔲' => 'u', '𝔳' => 'v', '𝔴' => 'w', '𝔵' => 'x', '𝔶' => 'y', '𝔷' => 'z', '𝔸' => 'A', '𝔹' => 'B', '𝔻' => 'D', '𝔼' => 'E', '𝔽' => 'F', '𝔾' => 'G', '𝕀' => 'I', '𝕁' => 'J', '𝕂' => 'K', '𝕃' => 'L', '𝕄' => 'M', '𝕆' => 'O', '𝕊' => 'S', '𝕋' => 'T', '𝕌' => 'U', '𝕍' => 'V', '𝕎' => 'W', '𝕏' => 'X', '𝕐' => 'Y', '𝕒' => 'a', '𝕓' => 'b', '𝕔' => 'c', '𝕕' => 'd', '𝕖' => 'e', '𝕗' => 'f', '𝕘' => 'g', '𝕙' => 'h', '𝕚' => 'i', '𝕛' => 'j', '𝕜' => 'k', '𝕝' => 'l', '𝕞' => 'm', '𝕟' => 'n', '𝕠' => 'o', '𝕡' => 'p', '𝕢' => 'q', '𝕣' => 'r', '𝕤' => 's', '𝕥' => 't', '𝕦' => 'u', '𝕧' => 'v', '𝕨' => 'w', '𝕩' => 'x', '𝕪' => 'y', '𝕫' => 'z', '𝕬' => 'A', '𝕭' => 'B', '𝕮' => 'C', '𝕯' => 'D', '𝕰' => 'E', '𝕱' => 'F', '𝕲' => 'G', '𝕳' => 'H', '𝕴' => 'I', '𝕵' => 'J', '𝕶' => 'K', '𝕷' => 'L', '𝕸' => 'M', '𝕹' => 'N', '𝕺' => 'O', '𝕻' => 'P', '𝕼' => 'Q', '𝕽' => 'R', '𝕾' => 'S', '𝕿' => 'T', '𝖀' => 'U', '𝖁' => 'V', '𝖂' => 'W', '𝖃' => 'X', '𝖄' => 'Y', '𝖅' => 'Z', '𝖆' => 'a', '𝖇' => 'b', '𝖈' => 'c', '𝖉' => 'd', '𝖊' => 'e', '𝖋' => 'f', '𝖌' => 'g', '𝖍' => 'h', '𝖎' => 'i', '𝖏' => 'j', '𝖐' => 'k', '𝖑' => 'l', '𝖒' => 'm', '𝖓' => 'n', '𝖔' => 'o', '𝖕' => 'p', '𝖖' => 'q', '𝖗' => 'r', '𝖘' => 's', '𝖙' => 't', '𝖚' => 'u', '𝖛' => 'v', '𝖜' => 'w', '𝖝' => 'x', '𝖞' => 'y', '𝖟' => 'z', '𝖠' => 'A', '𝖡' => 'B', '𝖢' => 'C', '𝖣' => 'D', '𝖤' => 'E', '𝖥' => 'F', '𝖦' => 'G', '𝖧' => 'H', '𝖨' => 'I', '𝖩' => 'J', '𝖪' => 'K', '𝖫' => 'L', '𝖬' => 'M', '𝖭' => 'N', '𝖮' => 'O', '𝖯' => 'P', '𝖰' => 'Q', '𝖱' => 'R', '𝖲' => 'S', '𝖳' => 'T', '𝖴' => 'U', '𝖵' => 'V', '𝖶' => 'W', '𝖷' => 'X', '𝖸' => 'Y', '𝖹' => 'Z', '𝖺' => 'a', '𝖻' => 'b', '𝖼' => 'c', '𝖽' => 'd', '𝖾' => 'e', '𝖿' => 'f', '𝗀' => 'g', '𝗁' => 'h', '𝗂' => 'i', '𝗃' => 'j', '𝗄' => 'k', '𝗅' => 'l', '𝗆' => 'm', '𝗇' => 'n', '𝗈' => 'o', '𝗉' => 'p', '𝗊' => 'q', '𝗋' => 'r', '𝗌' => 's', '𝗍' => 't', '𝗎' => 'u', '𝗏' => 'v', '𝗐' => 'w', '𝗑' => 'x', '𝗒' => 'y', '𝗓' => 'z', '𝗔' => 'A', '𝗕' => 'B', '𝗖' => 'C', '𝗗' => 'D', '𝗘' => 'E', '𝗙' => 'F', '𝗚' => 'G', '𝗛' => 'H', '𝗜' => 'I', '𝗝' => 'J', '𝗞' => 'K', '𝗟' => 'L', '𝗠' => 'M', '𝗡' => 'N', '𝗢' => 'O', '𝗣' => 'P', '𝗤' => 'Q', '𝗥' => 'R', '𝗦' => 'S', '𝗧' => 'T', '𝗨' => 'U', '𝗩' => 'V', '𝗪' => 'W', '𝗫' => 'X', '𝗬' => 'Y', '𝗭' => 'Z', '𝗮' => 'a', '𝗯' => 'b', '𝗰' => 'c', '𝗱' => 'd', '𝗲' => 'e', '𝗳' => 'f', '𝗴' => 'g', '𝗵' => 'h', '𝗶' => 'i', '𝗷' => 'j', '𝗸' => 'k', '𝗹' => 'l', '𝗺' => 'm', '𝗻' => 'n', '𝗼' => 'o', '𝗽' => 'p', '𝗾' => 'q', '𝗿' => 'r', '𝘀' => 's', '𝘁' => 't', '𝘂' => 'u', '𝘃' => 'v', '𝘄' => 'w', '𝘅' => 'x', '𝘆' => 'y', '𝘇' => 'z', '𝘈' => 'A', '𝘉' => 'B', '𝘊' => 'C', '𝘋' => 'D', '𝘌' => 'E', '𝘍' => 'F', '𝘎' => 'G', '𝘏' => 'H', '𝘐' => 'I', '𝘑' => 'J', '𝘒' => 'K', '𝘓' => 'L', '𝘔' => 'M', '𝘕' => 'N', '𝘖' => 'O', '𝘗' => 'P', '𝘘' => 'Q', '𝘙' => 'R', '𝘚' => 'S', '𝘛' => 'T', '𝘜' => 'U', '𝘝' => 'V', '𝘞' => 'W', '𝘟' => 'X', '𝘠' => 'Y', '𝘡' => 'Z', '𝘢' => 'a', '𝘣' => 'b', '𝘤' => 'c', '𝘥' => 'd', '𝘦' => 'e', '𝘧' => 'f', '𝘨' => 'g', '𝘩' => 'h', '𝘪' => 'i', '𝘫' => 'j', '𝘬' => 'k', '𝘭' => 'l', '𝘮' => 'm', '𝘯' => 'n', '𝘰' => 'o', '𝘱' => 'p', '𝘲' => 'q', '𝘳' => 'r', '𝘴' => 's', '𝘵' => 't', '𝘶' => 'u', '𝘷' => 'v', '𝘸' => 'w', '𝘹' => 'x', '𝘺' => 'y', '𝘻' => 'z', '𝘼' => 'A', '𝘽' => 'B', '𝘾' => 'C', '𝘿' => 'D', '𝙀' => 'E', '𝙁' => 'F', '𝙂' => 'G', '𝙃' => 'H', '𝙄' => 'I', '𝙅' => 'J', '𝙆' => 'K', '𝙇' => 'L', '𝙈' => 'M', '𝙉' => 'N', '𝙊' => 'O', '𝙋' => 'P', '𝙌' => 'Q', '𝙍' => 'R', '𝙎' => 'S', '𝙏' => 'T', '𝙐' => 'U', '𝙑' => 'V', '𝙒' => 'W', '𝙓' => 'X', '𝙔' => 'Y', '𝙕' => 'Z', '𝙖' => 'a', '𝙗' => 'b', '𝙘' => 'c', '𝙙' => 'd', '𝙚' => 'e', '𝙛' => 'f', '𝙜' => 'g', '𝙝' => 'h', '𝙞' => 'i', '𝙟' => 'j', '𝙠' => 'k', '𝙡' => 'l', '𝙢' => 'm', '𝙣' => 'n', '𝙤' => 'o', '𝙥' => 'p', '𝙦' => 'q', '𝙧' => 'r', '𝙨' => 's', '𝙩' => 't', '𝙪' => 'u', '𝙫' => 'v', '𝙬' => 'w', '𝙭' => 'x', '𝙮' => 'y', '𝙯' => 'z', '𝙰' => 'A', '𝙱' => 'B', '𝙲' => 'C', '𝙳' => 'D', '𝙴' => 'E', '𝙵' => 'F', '𝙶' => 'G', '𝙷' => 'H', '𝙸' => 'I', '𝙹' => 'J', '𝙺' => 'K', '𝙻' => 'L', '𝙼' => 'M', '𝙽' => 'N', '𝙾' => 'O', '𝙿' => 'P', '𝚀' => 'Q', '𝚁' => 'R', '𝚂' => 'S', '𝚃' => 'T', '𝚄' => 'U', '𝚅' => 'V', '𝚆' => 'W', '𝚇' => 'X', '𝚈' => 'Y', '𝚉' => 'Z', '𝚊' => 'a', '𝚋' => 'b', '𝚌' => 'c', '𝚍' => 'd', '𝚎' => 'e', '𝚏' => 'f', '𝚐' => 'g', '𝚑' => 'h', '𝚒' => 'i', '𝚓' => 'j', '𝚔' => 'k', '𝚕' => 'l', '𝚖' => 'm', '𝚗' => 'n', '𝚘' => 'o', '𝚙' => 'p', '𝚚' => 'q', '𝚛' => 'r', '𝚜' => 's', '𝚝' => 't', '𝚞' => 'u', '𝚟' => 'v', '𝚠' => 'w', '𝚡' => 'x', '𝚢' => 'y', '𝚣' => 'z', '𝚤' => 'ı', '𝚥' => 'ȷ', '𝚨' => 'Α', '𝚩' => 'Β', '𝚪' => 'Γ', '𝚫' => 'Δ', '𝚬' => 'Ε', '𝚭' => 'Ζ', '𝚮' => 'Η', '𝚯' => 'Θ', '𝚰' => 'Ι', '𝚱' => 'Κ', '𝚲' => 'Λ', '𝚳' => 'Μ', '𝚴' => 'Ν', '𝚵' => 'Ξ', '𝚶' => 'Ο', '𝚷' => 'Π', '𝚸' => 'Ρ', '𝚹' => 'Θ', '𝚺' => 'Σ', '𝚻' => 'Τ', '𝚼' => 'Υ', '𝚽' => 'Φ', '𝚾' => 'Χ', '𝚿' => 'Ψ', '𝛀' => 'Ω', '𝛁' => '∇', '𝛂' => 'α', '𝛃' => 'β', '𝛄' => 'γ', '𝛅' => 'δ', '𝛆' => 'ε', '𝛇' => 'ζ', '𝛈' => 'η', '𝛉' => 'θ', '𝛊' => 'ι', '𝛋' => 'κ', '𝛌' => 'λ', '𝛍' => 'μ', '𝛎' => 'ν', '𝛏' => 'ξ', '𝛐' => 'ο', '𝛑' => 'π', '𝛒' => 'ρ', '𝛓' => 'ς', '𝛔' => 'σ', '𝛕' => 'τ', '𝛖' => 'υ', '𝛗' => 'φ', '𝛘' => 'χ', '𝛙' => 'ψ', '𝛚' => 'ω', '𝛛' => '∂', '𝛜' => 'ε', '𝛝' => 'θ', '𝛞' => 'κ', '𝛟' => 'φ', '𝛠' => 'ρ', '𝛡' => 'π', '𝛢' => 'Α', '𝛣' => 'Β', '𝛤' => 'Γ', '𝛥' => 'Δ', '𝛦' => 'Ε', '𝛧' => 'Ζ', '𝛨' => 'Η', '𝛩' => 'Θ', '𝛪' => 'Ι', '𝛫' => 'Κ', '𝛬' => 'Λ', '𝛭' => 'Μ', '𝛮' => 'Ν', '𝛯' => 'Ξ', '𝛰' => 'Ο', '𝛱' => 'Π', '𝛲' => 'Ρ', '𝛳' => 'Θ', '𝛴' => 'Σ', '𝛵' => 'Τ', '𝛶' => 'Υ', '𝛷' => 'Φ', '𝛸' => 'Χ', '𝛹' => 'Ψ', '𝛺' => 'Ω', '𝛻' => '∇', '𝛼' => 'α', '𝛽' => 'β', '𝛾' => 'γ', '𝛿' => 'δ', '𝜀' => 'ε', '𝜁' => 'ζ', '𝜂' => 'η', '𝜃' => 'θ', '𝜄' => 'ι', '𝜅' => 'κ', '𝜆' => 'λ', '𝜇' => 'μ', '𝜈' => 'ν', '𝜉' => 'ξ', '𝜊' => 'ο', '𝜋' => 'π', '𝜌' => 'ρ', '𝜍' => 'ς', '𝜎' => 'σ', '𝜏' => 'τ', '𝜐' => 'υ', '𝜑' => 'φ', '𝜒' => 'χ', '𝜓' => 'ψ', '𝜔' => 'ω', '𝜕' => '∂', '𝜖' => 'ε', '𝜗' => 'θ', '𝜘' => 'κ', '𝜙' => 'φ', '𝜚' => 'ρ', '𝜛' => 'π', '𝜜' => 'Α', '𝜝' => 'Β', '𝜞' => 'Γ', '𝜟' => 'Δ', '𝜠' => 'Ε', '𝜡' => 'Ζ', '𝜢' => 'Η', '𝜣' => 'Θ', '𝜤' => 'Ι', '𝜥' => 'Κ', '𝜦' => 'Λ', '𝜧' => 'Μ', '𝜨' => 'Ν', '𝜩' => 'Ξ', '𝜪' => 'Ο', '𝜫' => 'Π', '𝜬' => 'Ρ', '𝜭' => 'Θ', '𝜮' => 'Σ', '𝜯' => 'Τ', '𝜰' => 'Υ', '𝜱' => 'Φ', '𝜲' => 'Χ', '𝜳' => 'Ψ', '𝜴' => 'Ω', '𝜵' => '∇', '𝜶' => 'α', '𝜷' => 'β', '𝜸' => 'γ', '𝜹' => 'δ', '𝜺' => 'ε', '𝜻' => 'ζ', '𝜼' => 'η', '𝜽' => 'θ', '𝜾' => 'ι', '𝜿' => 'κ', '𝝀' => 'λ', '𝝁' => 'μ', '𝝂' => 'ν', '𝝃' => 'ξ', '𝝄' => 'ο', '𝝅' => 'π', '𝝆' => 'ρ', '𝝇' => 'ς', '𝝈' => 'σ', '𝝉' => 'τ', '𝝊' => 'υ', '𝝋' => 'φ', '𝝌' => 'χ', '𝝍' => 'ψ', '𝝎' => 'ω', '𝝏' => '∂', '𝝐' => 'ε', '𝝑' => 'θ', '𝝒' => 'κ', '𝝓' => 'φ', '𝝔' => 'ρ', '𝝕' => 'π', '𝝖' => 'Α', '𝝗' => 'Β', '𝝘' => 'Γ', '𝝙' => 'Δ', '𝝚' => 'Ε', '𝝛' => 'Ζ', '𝝜' => 'Η', '𝝝' => 'Θ', '𝝞' => 'Ι', '𝝟' => 'Κ', '𝝠' => 'Λ', '𝝡' => 'Μ', '𝝢' => 'Ν', '𝝣' => 'Ξ', '𝝤' => 'Ο', '𝝥' => 'Π', '𝝦' => 'Ρ', '𝝧' => 'Θ', '𝝨' => 'Σ', '𝝩' => 'Τ', '𝝪' => 'Υ', '𝝫' => 'Φ', '𝝬' => 'Χ', '𝝭' => 'Ψ', '𝝮' => 'Ω', '𝝯' => '∇', '𝝰' => 'α', '𝝱' => 'β', '𝝲' => 'γ', '𝝳' => 'δ', '𝝴' => 'ε', '𝝵' => 'ζ', '𝝶' => 'η', '𝝷' => 'θ', '𝝸' => 'ι', '𝝹' => 'κ', '𝝺' => 'λ', '𝝻' => 'μ', '𝝼' => 'ν', '𝝽' => 'ξ', '𝝾' => 'ο', '𝝿' => 'π', '𝞀' => 'ρ', '𝞁' => 'ς', '𝞂' => 'σ', '𝞃' => 'τ', '𝞄' => 'υ', '𝞅' => 'φ', '𝞆' => 'χ', '𝞇' => 'ψ', '𝞈' => 'ω', '𝞉' => '∂', '𝞊' => 'ε', '𝞋' => 'θ', '𝞌' => 'κ', '𝞍' => 'φ', '𝞎' => 'ρ', '𝞏' => 'π', '𝞐' => 'Α', '𝞑' => 'Β', '𝞒' => 'Γ', '𝞓' => 'Δ', '𝞔' => 'Ε', '𝞕' => 'Ζ', '𝞖' => 'Η', '𝞗' => 'Θ', '𝞘' => 'Ι', '𝞙' => 'Κ', '𝞚' => 'Λ', '𝞛' => 'Μ', '𝞜' => 'Ν', '𝞝' => 'Ξ', '𝞞' => 'Ο', '𝞟' => 'Π', '𝞠' => 'Ρ', '𝞡' => 'Θ', '𝞢' => 'Σ', '𝞣' => 'Τ', '𝞤' => 'Υ', '𝞥' => 'Φ', '𝞦' => 'Χ', '𝞧' => 'Ψ', '𝞨' => 'Ω', '𝞩' => '∇', '𝞪' => 'α', '𝞫' => 'β', '𝞬' => 'γ', '𝞭' => 'δ', '𝞮' => 'ε', '𝞯' => 'ζ', '𝞰' => 'η', '𝞱' => 'θ', '𝞲' => 'ι', '𝞳' => 'κ', '𝞴' => 'λ', '𝞵' => 'μ', '𝞶' => 'ν', '𝞷' => 'ξ', '𝞸' => 'ο', '𝞹' => 'π', '𝞺' => 'ρ', '𝞻' => 'ς', '𝞼' => 'σ', '𝞽' => 'τ', '𝞾' => 'υ', '𝞿' => 'φ', '𝟀' => 'χ', '𝟁' => 'ψ', '𝟂' => 'ω', '𝟃' => '∂', '𝟄' => 'ε', '𝟅' => 'θ', '𝟆' => 'κ', '𝟇' => 'φ', '𝟈' => 'ρ', '𝟉' => 'π', '𝟊' => 'Ϝ', '𝟋' => 'ϝ', '𝟎' => '0', '𝟏' => '1', '𝟐' => '2', '𝟑' => '3', '𝟒' => '4', '𝟓' => '5', '𝟔' => '6', '𝟕' => '7', '𝟖' => '8', '𝟗' => '9', '𝟘' => '0', '𝟙' => '1', '𝟚' => '2', '𝟛' => '3', '𝟜' => '4', '𝟝' => '5', '𝟞' => '6', '𝟟' => '7', '𝟠' => '8', '𝟡' => '9', '𝟢' => '0', '𝟣' => '1', '𝟤' => '2', '𝟥' => '3', '𝟦' => '4', '𝟧' => '5', '𝟨' => '6', '𝟩' => '7', '𝟪' => '8', '𝟫' => '9', '𝟬' => '0', '𝟭' => '1', '𝟮' => '2', '𝟯' => '3', '𝟰' => '4', '𝟱' => '5', '𝟲' => '6', '𝟳' => '7', '𝟴' => '8', '𝟵' => '9', '𝟶' => '0', '𝟷' => '1', '𝟸' => '2', '𝟹' => '3', '𝟺' => '4', '𝟻' => '5', '𝟼' => '6', '𝟽' => '7', '𝟾' => '8', '𝟿' => '9', '𞸀' => 'ا', '𞸁' => 'ب', '𞸂' => 'ج', '𞸃' => 'د', '𞸅' => 'و', '𞸆' => 'ز', '𞸇' => 'ح', '𞸈' => 'ط', '𞸉' => 'ي', '𞸊' => 'ك', '𞸋' => 'ل', '𞸌' => 'م', '𞸍' => 'ن', '𞸎' => 'س', '𞸏' => 'ع', '𞸐' => 'ف', '𞸑' => 'ص', '𞸒' => 'ق', '𞸓' => 'ر', '𞸔' => 'ش', '𞸕' => 'ت', '𞸖' => 'ث', '𞸗' => 'خ', '𞸘' => 'ذ', '𞸙' => 'ض', '𞸚' => 'ظ', '𞸛' => 'غ', '𞸜' => 'ٮ', '𞸝' => 'ں', '𞸞' => 'ڡ', '𞸟' => 'ٯ', '𞸡' => 'ب', '𞸢' => 'ج', '𞸤' => 'ه', '𞸧' => 'ح', '𞸩' => 'ي', '𞸪' => 'ك', '𞸫' => 'ل', '𞸬' => 'م', '𞸭' => 'ن', '𞸮' => 'س', '𞸯' => 'ع', '𞸰' => 'ف', '𞸱' => 'ص', '𞸲' => 'ق', '𞸴' => 'ش', '𞸵' => 'ت', '𞸶' => 'ث', '𞸷' => 'خ', '𞸹' => 'ض', '𞸻' => 'غ', '𞹂' => 'ج', '𞹇' => 'ح', '𞹉' => 'ي', '𞹋' => 'ل', '𞹍' => 'ن', '𞹎' => 'س', '𞹏' => 'ع', '𞹑' => 'ص', '𞹒' => 'ق', '𞹔' => 'ش', '𞹗' => 'خ', '𞹙' => 'ض', '𞹛' => 'غ', '𞹝' => 'ں', '𞹟' => 'ٯ', '𞹡' => 'ب', '𞹢' => 'ج', '𞹤' => 'ه', '𞹧' => 'ح', '𞹨' => 'ط', '𞹩' => 'ي', '𞹪' => 'ك', '𞹬' => 'م', '𞹭' => 'ن', '𞹮' => 'س', '𞹯' => 'ع', '𞹰' => 'ف', '𞹱' => 'ص', '𞹲' => 'ق', '𞹴' => 'ش', '𞹵' => 'ت', '𞹶' => 'ث', '𞹷' => 'خ', '𞹹' => 'ض', '𞹺' => 'ظ', '𞹻' => 'غ', '𞹼' => 'ٮ', '𞹾' => 'ڡ', '𞺀' => 'ا', '𞺁' => 'ب', '𞺂' => 'ج', '𞺃' => 'د', '𞺄' => 'ه', '𞺅' => 'و', '𞺆' => 'ز', '𞺇' => 'ح', '𞺈' => 'ط', '𞺉' => 'ي', '𞺋' => 'ل', '𞺌' => 'م', '𞺍' => 'ن', '𞺎' => 'س', '𞺏' => 'ع', '𞺐' => 'ف', '𞺑' => 'ص', '𞺒' => 'ق', '𞺓' => 'ر', '𞺔' => 'ش', '𞺕' => 'ت', '𞺖' => 'ث', '𞺗' => 'خ', '𞺘' => 'ذ', '𞺙' => 'ض', '𞺚' => 'ظ', '𞺛' => 'غ', '𞺡' => 'ب', '𞺢' => 'ج', '𞺣' => 'د', '𞺥' => 'و', '𞺦' => 'ز', '𞺧' => 'ح', '𞺨' => 'ط', '𞺩' => 'ي', '𞺫' => 'ل', '𞺬' => 'م', '𞺭' => 'ن', '𞺮' => 'س', '𞺯' => 'ع', '𞺰' => 'ف', '𞺱' => 'ص', '𞺲' => 'ق', '𞺳' => 'ر', '𞺴' => 'ش', '𞺵' => 'ت', '𞺶' => 'ث', '𞺷' => 'خ', '𞺸' => 'ذ', '𞺹' => 'ض', '𞺺' => 'ظ', '𞺻' => 'غ', '🄀' => '0.', '🄁' => '0,', '🄂' => '1,', '🄃' => '2,', '🄄' => '3,', '🄅' => '4,', '🄆' => '5,', '🄇' => '6,', '🄈' => '7,', '🄉' => '8,', '🄊' => '9,', '🄐' => '(A)', '🄑' => '(B)', '🄒' => '(C)', '🄓' => '(D)', '🄔' => '(E)', '🄕' => '(F)', '🄖' => '(G)', '🄗' => '(H)', '🄘' => '(I)', '🄙' => '(J)', '🄚' => '(K)', '🄛' => '(L)', '🄜' => '(M)', '🄝' => '(N)', '🄞' => '(O)', '🄟' => '(P)', '🄠' => '(Q)', '🄡' => '(R)', '🄢' => '(S)', '🄣' => '(T)', '🄤' => '(U)', '🄥' => '(V)', '🄦' => '(W)', '🄧' => '(X)', '🄨' => '(Y)', '🄩' => '(Z)', '🄪' => '〔S〕', '🄫' => 'C', '🄬' => 'R', '🄭' => 'CD', '🄮' => 'WZ', '🄰' => 'A', '🄱' => 'B', '🄲' => 'C', '🄳' => 'D', '🄴' => 'E', '🄵' => 'F', '🄶' => 'G', '🄷' => 'H', '🄸' => 'I', '🄹' => 'J', '🄺' => 'K', '🄻' => 'L', '🄼' => 'M', '🄽' => 'N', '🄾' => 'O', '🄿' => 'P', '🅀' => 'Q', '🅁' => 'R', '🅂' => 'S', '🅃' => 'T', '🅄' => 'U', '🅅' => 'V', '🅆' => 'W', '🅇' => 'X', '🅈' => 'Y', '🅉' => 'Z', '🅊' => 'HV', '🅋' => 'MV', '🅌' => 'SD', '🅍' => 'SS', '🅎' => 'PPV', '🅏' => 'WC', '🅪' => 'MC', '🅫' => 'MD', '🅬' => 'MR', '🆐' => 'DJ', '🈀' => 'ほか', '🈁' => 'ココ', '🈂' => 'サ', '🈐' => '手', '🈑' => '字', '🈒' => '双', '🈓' => 'デ', '🈔' => '二', '🈕' => '多', '🈖' => '解', '🈗' => '天', '🈘' => '交', '🈙' => '映', '🈚' => '無', '🈛' => '料', '🈜' => '前', '🈝' => '後', '🈞' => '再', '🈟' => '新', '🈠' => '初', '🈡' => '終', '🈢' => '生', '🈣' => '販', '🈤' => '声', '🈥' => '吹', '🈦' => '演', '🈧' => '投', '🈨' => '捕', '🈩' => '一', '🈪' => '三', '🈫' => '遊', '🈬' => '左', '🈭' => '中', '🈮' => '右', '🈯' => '指', '🈰' => '走', '🈱' => '打', '🈲' => '禁', '🈳' => '空', '🈴' => '合', '🈵' => '満', '🈶' => '有', '🈷' => '月', '🈸' => '申', '🈹' => '割', '🈺' => '営', '🈻' => '配', '🉀' => '〔本〕', '🉁' => '〔三〕', '🉂' => '〔二〕', '🉃' => '〔安〕', '🉄' => '〔点〕', '🉅' => '〔打〕', '🉆' => '〔盗〕', '🉇' => '〔勝〕', '🉈' => '〔敗〕', '🉐' => '得', '🉑' => '可', '🯰' => '0', '🯱' => '1', '🯲' => '2', '🯳' => '3', '🯴' => '4', '🯵' => '5', '🯶' => '6', '🯷' => '7', '🯸' => '8', '🯹' => '9'); diff --git a/vendor/symfony/polyfill-intl-normalizer/bootstrap.php b/vendor/symfony/polyfill-intl-normalizer/bootstrap.php new file mode 100644 index 00000000..867281b5 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/bootstrap.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use Symfony\Polyfill\Intl\Normalizer as p; +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__ . '/bootstrap80.php'; +} +if (!\function_exists('normalizer_is_normalized')) { + function normalizer_is_normalized($string, $form = p\Normalizer::FORM_C) + { + return p\Normalizer::isNormalized($string, $form); + } +} +if (!\function_exists('normalizer_normalize')) { + function normalizer_normalize($string, $form = p\Normalizer::FORM_C) + { + return p\Normalizer::normalize($string, $form); + } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php b/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php new file mode 100644 index 00000000..a3bdb46f --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/bootstrap80.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use Symfony\Polyfill\Intl\Normalizer as p; +if (!\function_exists('normalizer_is_normalized')) { + function normalizer_is_normalized(?string $string, ?int $form = p\Normalizer::FORM_C) : bool + { + return p\Normalizer::isNormalized((string) $string, (int) $form); + } +} +if (!\function_exists('normalizer_normalize')) { + /** + * @return string|false + */ + function normalizer_normalize(?string $string, ?int $form = p\Normalizer::FORM_C) + { + return p\Normalizer::normalize((string) $string, (int) $form); + } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/composer.json b/vendor/symfony/polyfill-intl-normalizer/composer.json new file mode 100644 index 00000000..431b8833 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/composer.json @@ -0,0 +1,49 @@ +{ + "name": "symfony\/polyfill-intl-normalizer", + "type": "library", + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "keywords": [ + "polyfill", + "shim", + "compatibility", + "portable", + "intl", + "normalizer" + ], + "homepage": "https:\/\/symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources\/stubs" + ] + }, + "suggest": { + "ext-intl": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "thanks": { + "name": "symfony\/polyfill", + "url": "https:\/\/github.com\/symfony\/polyfill" + } + } +} \ No newline at end of file diff --git a/vendor/symfony/polyfill-mbstring/LICENSE b/vendor/symfony/polyfill-mbstring/LICENSE new file mode 100644 index 00000000..6e3afce6 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-present Fabien Potencier + +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/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php new file mode 100644 index 00000000..3b0a3eb2 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -0,0 +1,753 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Symfony\Polyfill\Mbstring; + +/** + * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. + * + * Implemented: + * - mb_chr - Returns a specific character from its Unicode code point + * - mb_convert_encoding - Convert character encoding + * - mb_convert_variables - Convert character code in variable(s) + * - mb_decode_mimeheader - Decode string in MIME header field + * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED + * - mb_decode_numericentity - Decode HTML numeric string reference to character + * - mb_encode_numericentity - Encode character to HTML numeric string reference + * - mb_convert_case - Perform case folding on a string + * - mb_detect_encoding - Detect character encoding + * - mb_get_info - Get internal settings of mbstring + * - mb_http_input - Detect HTTP input character encoding + * - mb_http_output - Set/Get HTTP output character encoding + * - mb_internal_encoding - Set/Get internal character encoding + * - mb_list_encodings - Returns an array of all supported encodings + * - mb_ord - Returns the Unicode code point of a character + * - mb_output_handler - Callback function converts character encoding in output buffer + * - mb_scrub - Replaces ill-formed byte sequences with substitute characters + * - mb_strlen - Get string length + * - mb_strpos - Find position of first occurrence of string in a string + * - mb_strrpos - Find position of last occurrence of a string in a string + * - mb_str_split - Convert a string to an array + * - mb_strtolower - Make a string lowercase + * - mb_strtoupper - Make a string uppercase + * - mb_substitute_character - Set/Get substitution character + * - mb_substr - Get part of string + * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive + * - mb_stristr - Finds first occurrence of a string within another, case insensitive + * - mb_strrchr - Finds the last occurrence of a character in a string within another + * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive + * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive + * - mb_strstr - Finds first occurrence of a string within another + * - mb_strwidth - Return width of string + * - mb_substr_count - Count the number of substring occurrences + * + * Not implemented: + * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) + * - mb_ereg_* - Regular expression with multibyte support + * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable + * - mb_preferred_mime_name - Get MIME charset string + * - mb_regex_encoding - Returns current encoding for multibyte regex as string + * - mb_regex_set_options - Set/Get the default options for mbregex functions + * - mb_send_mail - Send encoded mail + * - mb_split - Split multibyte string using regular expression + * - mb_strcut - Get part of string + * - mb_strimwidth - Get truncated string with specified width + * + * @author Nicolas Grekas + * + * @internal + */ +final class Mbstring +{ + public const MB_CASE_FOLD = \PHP_INT_MAX; + private const SIMPLE_CASE_FOLD = [['µ', 'ſ', "ͅ", 'ς', "ϐ", "ϑ", "ϕ", "ϖ", "ϰ", "ϱ", "ϵ", "ẛ", "ι"], ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "ṡ", 'ι']]; + private static $encodingList = ['ASCII', 'UTF-8']; + private static $language = 'neutral'; + private static $internalEncoding = 'UTF-8'; + public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) + { + if (\is_array($fromEncoding) || null !== $fromEncoding && \false !== \strpos($fromEncoding, ',')) { + $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); + } else { + $fromEncoding = self::getEncoding($fromEncoding); + } + $toEncoding = self::getEncoding($toEncoding); + if ('BASE64' === $fromEncoding) { + $s = \base64_decode($s); + $fromEncoding = $toEncoding; + } + if ('BASE64' === $toEncoding) { + return \base64_encode($s); + } + if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { + if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { + $fromEncoding = 'Windows-1252'; + } + if ('UTF-8' !== $fromEncoding) { + $s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s); + } + return \preg_replace_callback('/[\\x80-\\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s); + } + if ('HTML-ENTITIES' === $fromEncoding) { + $s = \html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); + $fromEncoding = 'UTF-8'; + } + return \iconv($fromEncoding, $toEncoding . '//IGNORE', $s); + } + public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars) + { + $ok = \true; + \array_walk_recursive($vars, function (&$v) use(&$ok, $toEncoding, $fromEncoding) { + if (\false === ($v = self::mb_convert_encoding($v, $toEncoding, $fromEncoding))) { + $ok = \false; + } + }); + return $ok ? $fromEncoding : \false; + } + public static function mb_decode_mimeheader($s) + { + return \iconv_mime_decode($s, 2, self::$internalEncoding); + } + public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) + { + \trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); + } + public static function mb_decode_numericentity($s, $convmap, $encoding = null) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { + \trigger_error('mb_decode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); + return null; + } + if (!\is_array($convmap) || 80000 > \PHP_VERSION_ID && !$convmap) { + return \false; + } + if (null !== $encoding && !\is_scalar($encoding)) { + \trigger_error('mb_decode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); + return ''; + // Instead of null (cf. mb_encode_numericentity). + } + $s = (string) $s; + if ('' === $s) { + return ''; + } + $encoding = self::getEncoding($encoding); + if ('UTF-8' === $encoding) { + $encoding = null; + if (!\preg_match('//u', $s)) { + $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + } + $cnt = \floor(\count($convmap) / 4) * 4; + for ($i = 0; $i < $cnt; $i += 4) { + // collector_decode_htmlnumericentity ignores $convmap[$i + 3] + $convmap[$i] += $convmap[$i + 2]; + $convmap[$i + 1] += $convmap[$i + 2]; + } + $s = \preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use($cnt, $convmap) { + $c = isset($m[2]) ? (int) \hexdec($m[2]) : $m[1]; + for ($i = 0; $i < $cnt; $i += 4) { + if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { + return self::mb_chr($c - $convmap[$i + 2]); + } + } + return $m[0]; + }, $s); + if (null === $encoding) { + return $s; + } + return \iconv('UTF-8', $encoding . '//IGNORE', $s); + } + public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = \false) + { + if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { + \trigger_error('mb_encode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); + return null; + } + if (!\is_array($convmap) || 80000 > \PHP_VERSION_ID && !$convmap) { + return \false; + } + if (null !== $encoding && !\is_scalar($encoding)) { + \trigger_error('mb_encode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); + return null; + // Instead of '' (cf. mb_decode_numericentity). + } + if (null !== $is_hex && !\is_scalar($is_hex)) { + \trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, ' . \gettype($s) . ' given', \E_USER_WARNING); + return null; + } + $s = (string) $s; + if ('' === $s) { + return ''; + } + $encoding = self::getEncoding($encoding); + if ('UTF-8' === $encoding) { + $encoding = null; + if (!\preg_match('//u', $s)) { + $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + } + static $ulenMask = ["\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4]; + $cnt = \floor(\count($convmap) / 4) * 4; + $i = 0; + $len = \strlen($s); + $result = ''; + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"]; + $uchr = \substr($s, $i, $ulen); + $i += $ulen; + $c = self::mb_ord($uchr); + for ($j = 0; $j < $cnt; $j += 4) { + if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { + $cOffset = $c + $convmap[$j + 2] & $convmap[$j + 3]; + $result .= $is_hex ? \sprintf('&#x%X;', $cOffset) : '&#' . $cOffset . ';'; + continue 2; + } + } + $result .= $uchr; + } + if (null === $encoding) { + return $result; + } + return \iconv('UTF-8', $encoding . '//IGNORE', $result); + } + public static function mb_convert_case($s, $mode, $encoding = null) + { + $s = (string) $s; + if ('' === $s) { + return ''; + } + $encoding = self::getEncoding($encoding); + if ('UTF-8' === $encoding) { + $encoding = null; + if (!\preg_match('//u', $s)) { + $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); + } + } else { + $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + } + if (\MB_CASE_TITLE == $mode) { + static $titleRegexp = null; + if (null === $titleRegexp) { + $titleRegexp = self::getData('titleCaseRegexp'); + } + $s = \preg_replace_callback($titleRegexp, [__CLASS__, 'title_case'], $s); + } else { + if (\MB_CASE_UPPER == $mode) { + static $upper = null; + if (null === $upper) { + $upper = self::getData('upperCase'); + } + $map = $upper; + } else { + if (self::MB_CASE_FOLD === $mode) { + static $caseFolding = null; + if (null === $caseFolding) { + $caseFolding = self::getData('caseFolding'); + } + $s = \strtr($s, $caseFolding); + } + static $lower = null; + if (null === $lower) { + $lower = self::getData('lowerCase'); + } + $map = $lower; + } + static $ulenMask = ["\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4]; + $i = 0; + $len = \strlen($s); + while ($i < $len) { + $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"]; + $uchr = \substr($s, $i, $ulen); + $i += $ulen; + if (isset($map[$uchr])) { + $uchr = $map[$uchr]; + $nlen = \strlen($uchr); + if ($nlen == $ulen) { + $nlen = $i; + do { + $s[--$nlen] = $uchr[--$ulen]; + } while ($ulen); + } else { + $s = \substr_replace($s, $uchr, $i - $ulen, $ulen); + $len += $nlen - $ulen; + $i += $nlen - $ulen; + } + } + } + } + if (null === $encoding) { + return $s; + } + return \iconv('UTF-8', $encoding . '//IGNORE', $s); + } + public static function mb_internal_encoding($encoding = null) + { + if (null === $encoding) { + return self::$internalEncoding; + } + $normalizedEncoding = self::getEncoding($encoding); + if ('UTF-8' === $normalizedEncoding || \false !== @\iconv($normalizedEncoding, $normalizedEncoding, ' ')) { + self::$internalEncoding = $normalizedEncoding; + return \true; + } + if (80000 > \PHP_VERSION_ID) { + return \false; + } + throw new \ValueError(\sprintf('Argument #1 ($encoding) must be a valid encoding, "%s" given', $encoding)); + } + public static function mb_language($lang = null) + { + if (null === $lang) { + return self::$language; + } + switch ($normalizedLang = \strtolower($lang)) { + case 'uni': + case 'neutral': + self::$language = $normalizedLang; + return \true; + } + if (80000 > \PHP_VERSION_ID) { + return \false; + } + throw new \ValueError(\sprintf('Argument #1 ($language) must be a valid language, "%s" given', $lang)); + } + public static function mb_list_encodings() + { + return ['UTF-8']; + } + public static function mb_encoding_aliases($encoding) + { + switch (\strtoupper($encoding)) { + case 'UTF8': + case 'UTF-8': + return ['utf8']; + } + return \false; + } + public static function mb_check_encoding($var = null, $encoding = null) + { + if (\PHP_VERSION_ID < 70200 && \is_array($var)) { + \trigger_error('mb_check_encoding() expects parameter 1 to be string, array given', \E_USER_WARNING); + return null; + } + if (null === $encoding) { + if (null === $var) { + return \false; + } + $encoding = self::$internalEncoding; + } + if (!\is_array($var)) { + return self::mb_detect_encoding($var, [$encoding]) || \false !== @\iconv($encoding, $encoding, $var); + } + foreach ($var as $key => $value) { + if (!self::mb_check_encoding($key, $encoding)) { + return \false; + } + if (!self::mb_check_encoding($value, $encoding)) { + return \false; + } + } + return \true; + } + public static function mb_detect_encoding($str, $encodingList = null, $strict = \false) + { + if (null === $encodingList) { + $encodingList = self::$encodingList; + } else { + if (!\is_array($encodingList)) { + $encodingList = \array_map('trim', \explode(',', $encodingList)); + } + $encodingList = \array_map('strtoupper', $encodingList); + } + foreach ($encodingList as $enc) { + switch ($enc) { + case 'ASCII': + if (!\preg_match('/[\\x80-\\xFF]/', $str)) { + return $enc; + } + break; + case 'UTF8': + case 'UTF-8': + if (\preg_match('//u', $str)) { + return 'UTF-8'; + } + break; + default: + if (0 === \strncmp($enc, 'ISO-8859-', 9)) { + return $enc; + } + } + } + return \false; + } + public static function mb_detect_order($encodingList = null) + { + if (null === $encodingList) { + return self::$encodingList; + } + if (!\is_array($encodingList)) { + $encodingList = \array_map('trim', \explode(',', $encodingList)); + } + $encodingList = \array_map('strtoupper', $encodingList); + foreach ($encodingList as $enc) { + switch ($enc) { + default: + if (\strncmp($enc, 'ISO-8859-', 9)) { + return \false; + } + // no break + case 'ASCII': + case 'UTF8': + case 'UTF-8': + } + } + self::$encodingList = $encodingList; + return \true; + } + public static function mb_strlen($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return \strlen($s); + } + return @\iconv_strlen($s, $encoding); + } + public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return \strpos($haystack, $needle, $offset); + } + $needle = (string) $needle; + if ('' === $needle) { + if (80000 > \PHP_VERSION_ID) { + \trigger_error(__METHOD__ . ': Empty delimiter', \E_USER_WARNING); + return \false; + } + return 0; + } + return \iconv_strpos($haystack, $needle, $offset, $encoding); + } + public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return \strrpos($haystack, $needle, $offset); + } + if ($offset != (int) $offset) { + $offset = 0; + } elseif ($offset = (int) $offset) { + if ($offset < 0) { + if (0 > ($offset += self::mb_strlen($needle))) { + $haystack = self::mb_substr($haystack, 0, $offset, $encoding); + } + $offset = 0; + } else { + $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); + } + } + $pos = '' !== $needle || 80000 > \PHP_VERSION_ID ? \iconv_strrpos($haystack, $needle, $encoding) : self::mb_strlen($haystack, $encoding); + return \false !== $pos ? $offset + $pos : \false; + } + public static function mb_str_split($string, $split_length = 1, $encoding = null) + { + if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) { + \trigger_error('mb_str_split() expects parameter 1 to be string, ' . \gettype($string) . ' given', \E_USER_WARNING); + return null; + } + if (1 > ($split_length = (int) $split_length)) { + if (80000 > \PHP_VERSION_ID) { + \trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); + return \false; + } + throw new \ValueError('Argument #2 ($length) must be greater than 0'); + } + if (null === $encoding) { + $encoding = \mb_internal_encoding(); + } + if ('UTF-8' === ($encoding = self::getEncoding($encoding))) { + $rx = '/('; + while (65535 < $split_length) { + $rx .= '.{65535}'; + $split_length -= 65535; + } + $rx .= '.{' . $split_length . '})/us'; + return \preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); + } + $result = []; + $length = \mb_strlen($string, $encoding); + for ($i = 0; $i < $length; $i += $split_length) { + $result[] = \mb_substr($string, $i, $split_length, $encoding); + } + return $result; + } + public static function mb_strtolower($s, $encoding = null) + { + return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); + } + public static function mb_strtoupper($s, $encoding = null) + { + return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); + } + public static function mb_substitute_character($c = null) + { + if (null === $c) { + return 'none'; + } + if (0 === \strcasecmp($c, 'none')) { + return \true; + } + if (80000 > \PHP_VERSION_ID) { + return \false; + } + if (\is_int($c) || 'long' === $c || 'entity' === $c) { + return \false; + } + throw new \ValueError('Argument #1 ($substitute_character) must be "none", "long", "entity" or a valid codepoint'); + } + public static function mb_substr($s, $start, $length = null, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + return (string) \substr($s, $start, null === $length ? 2147483647 : $length); + } + if ($start < 0) { + $start = \iconv_strlen($s, $encoding) + $start; + if ($start < 0) { + $start = 0; + } + } + if (null === $length) { + $length = 2147483647; + } elseif ($length < 0) { + $length = \iconv_strlen($s, $encoding) + $length - $start; + if ($length < 0) { + return ''; + } + } + return (string) \iconv_substr($s, $start, $length, $encoding); + } + public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) + { + [$haystack, $needle] = \str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding), self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding)]); + return self::mb_strpos($haystack, $needle, $offset, $encoding); + } + public static function mb_stristr($haystack, $needle, $part = \false, $encoding = null) + { + $pos = self::mb_stripos($haystack, $needle, 0, $encoding); + return self::getSubpart($pos, $part, $haystack, $encoding); + } + public static function mb_strrchr($haystack, $needle, $part = \false, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('CP850' === $encoding || 'ASCII' === $encoding) { + $pos = \strrpos($haystack, $needle); + } else { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = \iconv_strrpos($haystack, $needle, $encoding); + } + return self::getSubpart($pos, $part, $haystack, $encoding); + } + public static function mb_strrichr($haystack, $needle, $part = \false, $encoding = null) + { + $needle = self::mb_substr($needle, 0, 1, $encoding); + $pos = self::mb_strripos($haystack, $needle, $encoding); + return self::getSubpart($pos, $part, $haystack, $encoding); + } + public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) + { + $haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding); + $needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding); + $haystack = \str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack); + $needle = \str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle); + return self::mb_strrpos($haystack, $needle, $offset, $encoding); + } + public static function mb_strstr($haystack, $needle, $part = \false, $encoding = null) + { + $pos = \strpos($haystack, $needle); + if (\false === $pos) { + return \false; + } + if ($part) { + return \substr($haystack, 0, $pos); + } + return \substr($haystack, $pos); + } + public static function mb_get_info($type = 'all') + { + $info = ['internal_encoding' => self::$internalEncoding, 'http_output' => 'pass', 'http_output_conv_mimetypes' => '^(text/|application/xhtml\\+xml)', 'func_overload' => 0, 'func_overload_list' => 'no overload', 'mail_charset' => 'UTF-8', 'mail_header_encoding' => 'BASE64', 'mail_body_encoding' => 'BASE64', 'illegal_chars' => 0, 'encoding_translation' => 'Off', 'language' => self::$language, 'detect_order' => self::$encodingList, 'substitute_character' => 'none', 'strict_detection' => 'Off']; + if ('all' === $type) { + return $info; + } + if (isset($info[$type])) { + return $info[$type]; + } + return \false; + } + public static function mb_http_input($type = '') + { + return \false; + } + public static function mb_http_output($encoding = null) + { + return null !== $encoding ? 'pass' === $encoding : 'pass'; + } + public static function mb_strwidth($s, $encoding = null) + { + $encoding = self::getEncoding($encoding); + if ('UTF-8' !== $encoding) { + $s = \iconv($encoding, 'UTF-8//IGNORE', $s); + } + $s = \preg_replace('/[\\x{1100}-\\x{115F}\\x{2329}\\x{232A}\\x{2E80}-\\x{303E}\\x{3040}-\\x{A4CF}\\x{AC00}-\\x{D7A3}\\x{F900}-\\x{FAFF}\\x{FE10}-\\x{FE19}\\x{FE30}-\\x{FE6F}\\x{FF00}-\\x{FF60}\\x{FFE0}-\\x{FFE6}\\x{20000}-\\x{2FFFD}\\x{30000}-\\x{3FFFD}]/u', '', $s, -1, $wide); + return ($wide << 1) + \iconv_strlen($s, 'UTF-8'); + } + public static function mb_substr_count($haystack, $needle, $encoding = null) + { + return \substr_count($haystack, $needle); + } + public static function mb_output_handler($contents, $status) + { + return $contents; + } + public static function mb_chr($code, $encoding = null) + { + if (0x80 > ($code %= 0x200000)) { + $s = \chr($code); + } elseif (0x800 > $code) { + $s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); + } elseif (0x10000 > $code) { + $s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); + } else { + $s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); + } + if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) { + $s = \mb_convert_encoding($s, $encoding, 'UTF-8'); + } + return $s; + } + public static function mb_ord($s, $encoding = null) + { + if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) { + $s = \mb_convert_encoding($s, 'UTF-8', $encoding); + } + if (1 === \strlen($s)) { + return \ord($s); + } + $code = ($s = \unpack('C*', \substr($s, 0, 4))) ? $s[1] : 0; + if (0xf0 <= $code) { + return ($code - 0xf0 << 18) + ($s[2] - 0x80 << 12) + ($s[3] - 0x80 << 6) + $s[4] - 0x80; + } + if (0xe0 <= $code) { + return ($code - 0xe0 << 12) + ($s[2] - 0x80 << 6) + $s[3] - 0x80; + } + if (0xc0 <= $code) { + return ($code - 0xc0 << 6) + $s[2] - 0x80; + } + return $code; + } + public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, string $encoding = null) : string + { + if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], \true)) { + throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); + } + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } + try { + $validEncoding = @self::mb_check_encoding('', $encoding); + } catch (\ValueError $e) { + throw new \ValueError(\sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); + } + // BC for PHP 7.3 and lower + if (!$validEncoding) { + throw new \ValueError(\sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); + } + if (self::mb_strlen($pad_string, $encoding) <= 0) { + throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); + } + $paddingRequired = $length - self::mb_strlen($string, $encoding); + if ($paddingRequired < 1) { + return $string; + } + switch ($pad_type) { + case \STR_PAD_LEFT: + return self::mb_substr(\str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding) . $string; + case \STR_PAD_RIGHT: + return $string . self::mb_substr(\str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); + default: + $leftPaddingLength = \floor($paddingRequired / 2); + $rightPaddingLength = $paddingRequired - $leftPaddingLength; + return self::mb_substr(\str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding) . $string . self::mb_substr(\str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); + } + } + private static function getSubpart($pos, $part, $haystack, $encoding) + { + if (\false === $pos) { + return \false; + } + if ($part) { + return self::mb_substr($haystack, 0, $pos, $encoding); + } + return self::mb_substr($haystack, $pos, null, $encoding); + } + private static function html_encoding_callback(array $m) + { + $i = 1; + $entities = ''; + $m = \unpack('C*', \htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); + while (isset($m[$i])) { + if (0x80 > $m[$i]) { + $entities .= \chr($m[$i++]); + continue; + } + if (0xf0 <= $m[$i]) { + $c = ($m[$i++] - 0xf0 << 18) + ($m[$i++] - 0x80 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80; + } elseif (0xe0 <= $m[$i]) { + $c = ($m[$i++] - 0xe0 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80; + } else { + $c = ($m[$i++] - 0xc0 << 6) + $m[$i++] - 0x80; + } + $entities .= '&#' . $c . ';'; + } + return $entities; + } + private static function title_case(array $s) + { + return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8') . self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); + } + private static function getData($file) + { + if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) { + return require $file; + } + return \false; + } + private static function getEncoding($encoding) + { + if (null === $encoding) { + return self::$internalEncoding; + } + if ('UTF-8' === $encoding) { + return 'UTF-8'; + } + $encoding = \strtoupper($encoding); + if ('8BIT' === $encoding || 'BINARY' === $encoding) { + return 'CP850'; + } + if ('UTF8' === $encoding) { + return 'UTF-8'; + } + return $encoding; + } +} diff --git a/vendor/symfony/polyfill-mbstring/README.md b/vendor/symfony/polyfill-mbstring/README.md new file mode 100644 index 00000000..478b40da --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/README.md @@ -0,0 +1,13 @@ +Symfony Polyfill / Mbstring +=========================== + +This component provides a partial, native PHP implementation for the +[Mbstring](https://php.net/mbstring) extension. + +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-mbstring/Resources/unidata/caseFolding.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php new file mode 100644 index 00000000..2f9fc422 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php @@ -0,0 +1,5 @@ + 'i̇', 'µ' => 'μ', 'ſ' => 's', 'ͅ' => 'ι', 'ς' => 'σ', 'ϐ' => 'β', 'ϑ' => 'θ', 'ϕ' => 'φ', 'ϖ' => 'π', 'ϰ' => 'κ', 'ϱ' => 'ρ', 'ϵ' => 'ε', 'ẛ' => 'ṡ', 'ι' => 'ι', 'ß' => 'ss', 'ʼn' => 'ʼn', 'ǰ' => 'ǰ', 'ΐ' => 'ΐ', 'ΰ' => 'ΰ', 'և' => 'եւ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'ẘ', 'ẙ' => 'ẙ', 'ẚ' => 'aʾ', 'ẞ' => 'ss', 'ὐ' => 'ὐ', 'ὒ' => 'ὒ', 'ὔ' => 'ὔ', 'ὖ' => 'ὖ', 'ᾀ' => 'ἀι', 'ᾁ' => 'ἁι', 'ᾂ' => 'ἂι', 'ᾃ' => 'ἃι', 'ᾄ' => 'ἄι', 'ᾅ' => 'ἅι', 'ᾆ' => 'ἆι', 'ᾇ' => 'ἇι', 'ᾈ' => 'ἀι', 'ᾉ' => 'ἁι', 'ᾊ' => 'ἂι', 'ᾋ' => 'ἃι', 'ᾌ' => 'ἄι', 'ᾍ' => 'ἅι', 'ᾎ' => 'ἆι', 'ᾏ' => 'ἇι', 'ᾐ' => 'ἠι', 'ᾑ' => 'ἡι', 'ᾒ' => 'ἢι', 'ᾓ' => 'ἣι', 'ᾔ' => 'ἤι', 'ᾕ' => 'ἥι', 'ᾖ' => 'ἦι', 'ᾗ' => 'ἧι', 'ᾘ' => 'ἠι', 'ᾙ' => 'ἡι', 'ᾚ' => 'ἢι', 'ᾛ' => 'ἣι', 'ᾜ' => 'ἤι', 'ᾝ' => 'ἥι', 'ᾞ' => 'ἦι', 'ᾟ' => 'ἧι', 'ᾠ' => 'ὠι', 'ᾡ' => 'ὡι', 'ᾢ' => 'ὢι', 'ᾣ' => 'ὣι', 'ᾤ' => 'ὤι', 'ᾥ' => 'ὥι', 'ᾦ' => 'ὦι', 'ᾧ' => 'ὧι', 'ᾨ' => 'ὠι', 'ᾩ' => 'ὡι', 'ᾪ' => 'ὢι', 'ᾫ' => 'ὣι', 'ᾬ' => 'ὤι', 'ᾭ' => 'ὥι', 'ᾮ' => 'ὦι', 'ᾯ' => 'ὧι', 'ᾲ' => 'ὰι', 'ᾳ' => 'αι', 'ᾴ' => 'άι', 'ᾶ' => 'ᾶ', 'ᾷ' => 'ᾶι', 'ᾼ' => 'αι', 'ῂ' => 'ὴι', 'ῃ' => 'ηι', 'ῄ' => 'ήι', 'ῆ' => 'ῆ', 'ῇ' => 'ῆι', 'ῌ' => 'ηι', 'ῒ' => 'ῒ', 'ῖ' => 'ῖ', 'ῗ' => 'ῗ', 'ῢ' => 'ῢ', 'ῤ' => 'ῤ', 'ῦ' => 'ῦ', 'ῧ' => 'ῧ', 'ῲ' => 'ὼι', 'ῳ' => 'ωι', 'ῴ' => 'ώι', 'ῶ' => 'ῶ', 'ῷ' => 'ῶι', 'ῼ' => 'ωι', 'ff' => 'ff', 'fi' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'մն', 'ﬔ' => 'մե', 'ﬕ' => 'մի', 'ﬖ' => 'վն', 'ﬗ' => 'մխ']; diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php new file mode 100644 index 00000000..67a72980 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php @@ -0,0 +1,5 @@ + 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', 'À' => 'à', 'Á' => 'á', 'Â' => 'â', 'Ã' => 'ã', 'Ä' => 'ä', 'Å' => 'å', 'Æ' => 'æ', 'Ç' => 'ç', 'È' => 'è', 'É' => 'é', 'Ê' => 'ê', 'Ë' => 'ë', 'Ì' => 'ì', 'Í' => 'í', 'Î' => 'î', 'Ï' => 'ï', 'Ð' => 'ð', 'Ñ' => 'ñ', 'Ò' => 'ò', 'Ó' => 'ó', 'Ô' => 'ô', 'Õ' => 'õ', 'Ö' => 'ö', 'Ø' => 'ø', 'Ù' => 'ù', 'Ú' => 'ú', 'Û' => 'û', 'Ü' => 'ü', 'Ý' => 'ý', 'Þ' => 'þ', 'Ā' => 'ā', 'Ă' => 'ă', 'Ą' => 'ą', 'Ć' => 'ć', 'Ĉ' => 'ĉ', 'Ċ' => 'ċ', 'Č' => 'č', 'Ď' => 'ď', 'Đ' => 'đ', 'Ē' => 'ē', 'Ĕ' => 'ĕ', 'Ė' => 'ė', 'Ę' => 'ę', 'Ě' => 'ě', 'Ĝ' => 'ĝ', 'Ğ' => 'ğ', 'Ġ' => 'ġ', 'Ģ' => 'ģ', 'Ĥ' => 'ĥ', 'Ħ' => 'ħ', 'Ĩ' => 'ĩ', 'Ī' => 'ī', 'Ĭ' => 'ĭ', 'Į' => 'į', 'İ' => 'i̇', 'IJ' => 'ij', 'Ĵ' => 'ĵ', 'Ķ' => 'ķ', 'Ĺ' => 'ĺ', 'Ļ' => 'ļ', 'Ľ' => 'ľ', 'Ŀ' => 'ŀ', 'Ł' => 'ł', 'Ń' => 'ń', 'Ņ' => 'ņ', 'Ň' => 'ň', 'Ŋ' => 'ŋ', 'Ō' => 'ō', 'Ŏ' => 'ŏ', 'Ő' => 'ő', 'Œ' => 'œ', 'Ŕ' => 'ŕ', 'Ŗ' => 'ŗ', 'Ř' => 'ř', 'Ś' => 'ś', 'Ŝ' => 'ŝ', 'Ş' => 'ş', 'Š' => 'š', 'Ţ' => 'ţ', 'Ť' => 'ť', 'Ŧ' => 'ŧ', 'Ũ' => 'ũ', 'Ū' => 'ū', 'Ŭ' => 'ŭ', 'Ů' => 'ů', 'Ű' => 'ű', 'Ų' => 'ų', 'Ŵ' => 'ŵ', 'Ŷ' => 'ŷ', 'Ÿ' => 'ÿ', 'Ź' => 'ź', 'Ż' => 'ż', 'Ž' => 'ž', 'Ɓ' => 'ɓ', 'Ƃ' => 'ƃ', 'Ƅ' => 'ƅ', 'Ɔ' => 'ɔ', 'Ƈ' => 'ƈ', 'Ɖ' => 'ɖ', 'Ɗ' => 'ɗ', 'Ƌ' => 'ƌ', 'Ǝ' => 'ǝ', 'Ə' => 'ə', 'Ɛ' => 'ɛ', 'Ƒ' => 'ƒ', 'Ɠ' => 'ɠ', 'Ɣ' => 'ɣ', 'Ɩ' => 'ɩ', 'Ɨ' => 'ɨ', 'Ƙ' => 'ƙ', 'Ɯ' => 'ɯ', 'Ɲ' => 'ɲ', 'Ɵ' => 'ɵ', 'Ơ' => 'ơ', 'Ƣ' => 'ƣ', 'Ƥ' => 'ƥ', 'Ʀ' => 'ʀ', 'Ƨ' => 'ƨ', 'Ʃ' => 'ʃ', 'Ƭ' => 'ƭ', 'Ʈ' => 'ʈ', 'Ư' => 'ư', 'Ʊ' => 'ʊ', 'Ʋ' => 'ʋ', 'Ƴ' => 'ƴ', 'Ƶ' => 'ƶ', 'Ʒ' => 'ʒ', 'Ƹ' => 'ƹ', 'Ƽ' => 'ƽ', 'DŽ' => 'dž', 'Dž' => 'dž', 'LJ' => 'lj', 'Lj' => 'lj', 'NJ' => 'nj', 'Nj' => 'nj', 'Ǎ' => 'ǎ', 'Ǐ' => 'ǐ', 'Ǒ' => 'ǒ', 'Ǔ' => 'ǔ', 'Ǖ' => 'ǖ', 'Ǘ' => 'ǘ', 'Ǚ' => 'ǚ', 'Ǜ' => 'ǜ', 'Ǟ' => 'ǟ', 'Ǡ' => 'ǡ', 'Ǣ' => 'ǣ', 'Ǥ' => 'ǥ', 'Ǧ' => 'ǧ', 'Ǩ' => 'ǩ', 'Ǫ' => 'ǫ', 'Ǭ' => 'ǭ', 'Ǯ' => 'ǯ', 'DZ' => 'dz', 'Dz' => 'dz', 'Ǵ' => 'ǵ', 'Ƕ' => 'ƕ', 'Ƿ' => 'ƿ', 'Ǹ' => 'ǹ', 'Ǻ' => 'ǻ', 'Ǽ' => 'ǽ', 'Ǿ' => 'ǿ', 'Ȁ' => 'ȁ', 'Ȃ' => 'ȃ', 'Ȅ' => 'ȅ', 'Ȇ' => 'ȇ', 'Ȉ' => 'ȉ', 'Ȋ' => 'ȋ', 'Ȍ' => 'ȍ', 'Ȏ' => 'ȏ', 'Ȑ' => 'ȑ', 'Ȓ' => 'ȓ', 'Ȕ' => 'ȕ', 'Ȗ' => 'ȗ', 'Ș' => 'ș', 'Ț' => 'ț', 'Ȝ' => 'ȝ', 'Ȟ' => 'ȟ', 'Ƞ' => 'ƞ', 'Ȣ' => 'ȣ', 'Ȥ' => 'ȥ', 'Ȧ' => 'ȧ', 'Ȩ' => 'ȩ', 'Ȫ' => 'ȫ', 'Ȭ' => 'ȭ', 'Ȯ' => 'ȯ', 'Ȱ' => 'ȱ', 'Ȳ' => 'ȳ', 'Ⱥ' => 'ⱥ', 'Ȼ' => 'ȼ', 'Ƚ' => 'ƚ', 'Ⱦ' => 'ⱦ', 'Ɂ' => 'ɂ', 'Ƀ' => 'ƀ', 'Ʉ' => 'ʉ', 'Ʌ' => 'ʌ', 'Ɇ' => 'ɇ', 'Ɉ' => 'ɉ', 'Ɋ' => 'ɋ', 'Ɍ' => 'ɍ', 'Ɏ' => 'ɏ', 'Ͱ' => 'ͱ', 'Ͳ' => 'ͳ', 'Ͷ' => 'ͷ', 'Ϳ' => 'ϳ', 'Ά' => 'ά', 'Έ' => 'έ', 'Ή' => 'ή', 'Ί' => 'ί', 'Ό' => 'ό', 'Ύ' => 'ύ', 'Ώ' => 'ώ', 'Α' => 'α', 'Β' => 'β', 'Γ' => 'γ', 'Δ' => 'δ', 'Ε' => 'ε', 'Ζ' => 'ζ', 'Η' => 'η', 'Θ' => 'θ', 'Ι' => 'ι', 'Κ' => 'κ', 'Λ' => 'λ', 'Μ' => 'μ', 'Ν' => 'ν', 'Ξ' => 'ξ', 'Ο' => 'ο', 'Π' => 'π', 'Ρ' => 'ρ', 'Σ' => 'σ', 'Τ' => 'τ', 'Υ' => 'υ', 'Φ' => 'φ', 'Χ' => 'χ', 'Ψ' => 'ψ', 'Ω' => 'ω', 'Ϊ' => 'ϊ', 'Ϋ' => 'ϋ', 'Ϗ' => 'ϗ', 'Ϙ' => 'ϙ', 'Ϛ' => 'ϛ', 'Ϝ' => 'ϝ', 'Ϟ' => 'ϟ', 'Ϡ' => 'ϡ', 'Ϣ' => 'ϣ', 'Ϥ' => 'ϥ', 'Ϧ' => 'ϧ', 'Ϩ' => 'ϩ', 'Ϫ' => 'ϫ', 'Ϭ' => 'ϭ', 'Ϯ' => 'ϯ', 'ϴ' => 'θ', 'Ϸ' => 'ϸ', 'Ϲ' => 'ϲ', 'Ϻ' => 'ϻ', 'Ͻ' => 'ͻ', 'Ͼ' => 'ͼ', 'Ͽ' => 'ͽ', 'Ѐ' => 'ѐ', 'Ё' => 'ё', 'Ђ' => 'ђ', 'Ѓ' => 'ѓ', 'Є' => 'є', 'Ѕ' => 'ѕ', 'І' => 'і', 'Ї' => 'ї', 'Ј' => 'ј', 'Љ' => 'љ', 'Њ' => 'њ', 'Ћ' => 'ћ', 'Ќ' => 'ќ', 'Ѝ' => 'ѝ', 'Ў' => 'ў', 'Џ' => 'џ', 'А' => 'а', 'Б' => 'б', 'В' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'М' => 'м', 'Н' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'р', 'С' => 'с', 'Т' => 'т', 'У' => 'у', 'Ф' => 'ф', 'Х' => 'х', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ъ' => 'ъ', 'Ы' => 'ы', 'Ь' => 'ь', 'Э' => 'э', 'Ю' => 'ю', 'Я' => 'я', 'Ѡ' => 'ѡ', 'Ѣ' => 'ѣ', 'Ѥ' => 'ѥ', 'Ѧ' => 'ѧ', 'Ѩ' => 'ѩ', 'Ѫ' => 'ѫ', 'Ѭ' => 'ѭ', 'Ѯ' => 'ѯ', 'Ѱ' => 'ѱ', 'Ѳ' => 'ѳ', 'Ѵ' => 'ѵ', 'Ѷ' => 'ѷ', 'Ѹ' => 'ѹ', 'Ѻ' => 'ѻ', 'Ѽ' => 'ѽ', 'Ѿ' => 'ѿ', 'Ҁ' => 'ҁ', 'Ҋ' => 'ҋ', 'Ҍ' => 'ҍ', 'Ҏ' => 'ҏ', 'Ґ' => 'ґ', 'Ғ' => 'ғ', 'Ҕ' => 'ҕ', 'Җ' => 'җ', 'Ҙ' => 'ҙ', 'Қ' => 'қ', 'Ҝ' => 'ҝ', 'Ҟ' => 'ҟ', 'Ҡ' => 'ҡ', 'Ң' => 'ң', 'Ҥ' => 'ҥ', 'Ҧ' => 'ҧ', 'Ҩ' => 'ҩ', 'Ҫ' => 'ҫ', 'Ҭ' => 'ҭ', 'Ү' => 'ү', 'Ұ' => 'ұ', 'Ҳ' => 'ҳ', 'Ҵ' => 'ҵ', 'Ҷ' => 'ҷ', 'Ҹ' => 'ҹ', 'Һ' => 'һ', 'Ҽ' => 'ҽ', 'Ҿ' => 'ҿ', 'Ӏ' => 'ӏ', 'Ӂ' => 'ӂ', 'Ӄ' => 'ӄ', 'Ӆ' => 'ӆ', 'Ӈ' => 'ӈ', 'Ӊ' => 'ӊ', 'Ӌ' => 'ӌ', 'Ӎ' => 'ӎ', 'Ӑ' => 'ӑ', 'Ӓ' => 'ӓ', 'Ӕ' => 'ӕ', 'Ӗ' => 'ӗ', 'Ә' => 'ә', 'Ӛ' => 'ӛ', 'Ӝ' => 'ӝ', 'Ӟ' => 'ӟ', 'Ӡ' => 'ӡ', 'Ӣ' => 'ӣ', 'Ӥ' => 'ӥ', 'Ӧ' => 'ӧ', 'Ө' => 'ө', 'Ӫ' => 'ӫ', 'Ӭ' => 'ӭ', 'Ӯ' => 'ӯ', 'Ӱ' => 'ӱ', 'Ӳ' => 'ӳ', 'Ӵ' => 'ӵ', 'Ӷ' => 'ӷ', 'Ӹ' => 'ӹ', 'Ӻ' => 'ӻ', 'Ӽ' => 'ӽ', 'Ӿ' => 'ӿ', 'Ԁ' => 'ԁ', 'Ԃ' => 'ԃ', 'Ԅ' => 'ԅ', 'Ԇ' => 'ԇ', 'Ԉ' => 'ԉ', 'Ԋ' => 'ԋ', 'Ԍ' => 'ԍ', 'Ԏ' => 'ԏ', 'Ԑ' => 'ԑ', 'Ԓ' => 'ԓ', 'Ԕ' => 'ԕ', 'Ԗ' => 'ԗ', 'Ԙ' => 'ԙ', 'Ԛ' => 'ԛ', 'Ԝ' => 'ԝ', 'Ԟ' => 'ԟ', 'Ԡ' => 'ԡ', 'Ԣ' => 'ԣ', 'Ԥ' => 'ԥ', 'Ԧ' => 'ԧ', 'Ԩ' => 'ԩ', 'Ԫ' => 'ԫ', 'Ԭ' => 'ԭ', 'Ԯ' => 'ԯ', 'Ա' => 'ա', 'Բ' => 'բ', 'Գ' => 'գ', 'Դ' => 'դ', 'Ե' => 'ե', 'Զ' => 'զ', 'Է' => 'է', 'Ը' => 'ը', 'Թ' => 'թ', 'Ժ' => 'ժ', 'Ի' => 'ի', 'Լ' => 'լ', 'Խ' => 'խ', 'Ծ' => 'ծ', 'Կ' => 'կ', 'Հ' => 'հ', 'Ձ' => 'ձ', 'Ղ' => 'ղ', 'Ճ' => 'ճ', 'Մ' => 'մ', 'Յ' => 'յ', 'Ն' => 'ն', 'Շ' => 'շ', 'Ո' => 'ո', 'Չ' => 'չ', 'Պ' => 'պ', 'Ջ' => 'ջ', 'Ռ' => 'ռ', 'Ս' => 'ս', 'Վ' => 'վ', 'Տ' => 'տ', 'Ր' => 'ր', 'Ց' => 'ց', 'Ւ' => 'ւ', 'Փ' => 'փ', 'Ք' => 'ք', 'Օ' => 'օ', 'Ֆ' => 'ֆ', 'Ⴀ' => 'ⴀ', 'Ⴁ' => 'ⴁ', 'Ⴂ' => 'ⴂ', 'Ⴃ' => 'ⴃ', 'Ⴄ' => 'ⴄ', 'Ⴅ' => 'ⴅ', 'Ⴆ' => 'ⴆ', 'Ⴇ' => 'ⴇ', 'Ⴈ' => 'ⴈ', 'Ⴉ' => 'ⴉ', 'Ⴊ' => 'ⴊ', 'Ⴋ' => 'ⴋ', 'Ⴌ' => 'ⴌ', 'Ⴍ' => 'ⴍ', 'Ⴎ' => 'ⴎ', 'Ⴏ' => 'ⴏ', 'Ⴐ' => 'ⴐ', 'Ⴑ' => 'ⴑ', 'Ⴒ' => 'ⴒ', 'Ⴓ' => 'ⴓ', 'Ⴔ' => 'ⴔ', 'Ⴕ' => 'ⴕ', 'Ⴖ' => 'ⴖ', 'Ⴗ' => 'ⴗ', 'Ⴘ' => 'ⴘ', 'Ⴙ' => 'ⴙ', 'Ⴚ' => 'ⴚ', 'Ⴛ' => 'ⴛ', 'Ⴜ' => 'ⴜ', 'Ⴝ' => 'ⴝ', 'Ⴞ' => 'ⴞ', 'Ⴟ' => 'ⴟ', 'Ⴠ' => 'ⴠ', 'Ⴡ' => 'ⴡ', 'Ⴢ' => 'ⴢ', 'Ⴣ' => 'ⴣ', 'Ⴤ' => 'ⴤ', 'Ⴥ' => 'ⴥ', 'Ⴧ' => 'ⴧ', 'Ⴭ' => 'ⴭ', 'Ꭰ' => 'ꭰ', 'Ꭱ' => 'ꭱ', 'Ꭲ' => 'ꭲ', 'Ꭳ' => 'ꭳ', 'Ꭴ' => 'ꭴ', 'Ꭵ' => 'ꭵ', 'Ꭶ' => 'ꭶ', 'Ꭷ' => 'ꭷ', 'Ꭸ' => 'ꭸ', 'Ꭹ' => 'ꭹ', 'Ꭺ' => 'ꭺ', 'Ꭻ' => 'ꭻ', 'Ꭼ' => 'ꭼ', 'Ꭽ' => 'ꭽ', 'Ꭾ' => 'ꭾ', 'Ꭿ' => 'ꭿ', 'Ꮀ' => 'ꮀ', 'Ꮁ' => 'ꮁ', 'Ꮂ' => 'ꮂ', 'Ꮃ' => 'ꮃ', 'Ꮄ' => 'ꮄ', 'Ꮅ' => 'ꮅ', 'Ꮆ' => 'ꮆ', 'Ꮇ' => 'ꮇ', 'Ꮈ' => 'ꮈ', 'Ꮉ' => 'ꮉ', 'Ꮊ' => 'ꮊ', 'Ꮋ' => 'ꮋ', 'Ꮌ' => 'ꮌ', 'Ꮍ' => 'ꮍ', 'Ꮎ' => 'ꮎ', 'Ꮏ' => 'ꮏ', 'Ꮐ' => 'ꮐ', 'Ꮑ' => 'ꮑ', 'Ꮒ' => 'ꮒ', 'Ꮓ' => 'ꮓ', 'Ꮔ' => 'ꮔ', 'Ꮕ' => 'ꮕ', 'Ꮖ' => 'ꮖ', 'Ꮗ' => 'ꮗ', 'Ꮘ' => 'ꮘ', 'Ꮙ' => 'ꮙ', 'Ꮚ' => 'ꮚ', 'Ꮛ' => 'ꮛ', 'Ꮜ' => 'ꮜ', 'Ꮝ' => 'ꮝ', 'Ꮞ' => 'ꮞ', 'Ꮟ' => 'ꮟ', 'Ꮠ' => 'ꮠ', 'Ꮡ' => 'ꮡ', 'Ꮢ' => 'ꮢ', 'Ꮣ' => 'ꮣ', 'Ꮤ' => 'ꮤ', 'Ꮥ' => 'ꮥ', 'Ꮦ' => 'ꮦ', 'Ꮧ' => 'ꮧ', 'Ꮨ' => 'ꮨ', 'Ꮩ' => 'ꮩ', 'Ꮪ' => 'ꮪ', 'Ꮫ' => 'ꮫ', 'Ꮬ' => 'ꮬ', 'Ꮭ' => 'ꮭ', 'Ꮮ' => 'ꮮ', 'Ꮯ' => 'ꮯ', 'Ꮰ' => 'ꮰ', 'Ꮱ' => 'ꮱ', 'Ꮲ' => 'ꮲ', 'Ꮳ' => 'ꮳ', 'Ꮴ' => 'ꮴ', 'Ꮵ' => 'ꮵ', 'Ꮶ' => 'ꮶ', 'Ꮷ' => 'ꮷ', 'Ꮸ' => 'ꮸ', 'Ꮹ' => 'ꮹ', 'Ꮺ' => 'ꮺ', 'Ꮻ' => 'ꮻ', 'Ꮼ' => 'ꮼ', 'Ꮽ' => 'ꮽ', 'Ꮾ' => 'ꮾ', 'Ꮿ' => 'ꮿ', 'Ᏸ' => 'ᏸ', 'Ᏹ' => 'ᏹ', 'Ᏺ' => 'ᏺ', 'Ᏻ' => 'ᏻ', 'Ᏼ' => 'ᏼ', 'Ᏽ' => 'ᏽ', 'Ა' => 'ა', 'Ბ' => 'ბ', 'Გ' => 'გ', 'Დ' => 'დ', 'Ე' => 'ე', 'Ვ' => 'ვ', 'Ზ' => 'ზ', 'Თ' => 'თ', 'Ი' => 'ი', 'Კ' => 'კ', 'Ლ' => 'ლ', 'Მ' => 'მ', 'Ნ' => 'ნ', 'Ო' => 'ო', 'Პ' => 'პ', 'Ჟ' => 'ჟ', 'Რ' => 'რ', 'Ს' => 'ს', 'Ტ' => 'ტ', 'Უ' => 'უ', 'Ფ' => 'ფ', 'Ქ' => 'ქ', 'Ღ' => 'ღ', 'Ყ' => 'ყ', 'Შ' => 'შ', 'Ჩ' => 'ჩ', 'Ც' => 'ც', 'Ძ' => 'ძ', 'Წ' => 'წ', 'Ჭ' => 'ჭ', 'Ხ' => 'ხ', 'Ჯ' => 'ჯ', 'Ჰ' => 'ჰ', 'Ჱ' => 'ჱ', 'Ჲ' => 'ჲ', 'Ჳ' => 'ჳ', 'Ჴ' => 'ჴ', 'Ჵ' => 'ჵ', 'Ჶ' => 'ჶ', 'Ჷ' => 'ჷ', 'Ჸ' => 'ჸ', 'Ჹ' => 'ჹ', 'Ჺ' => 'ჺ', 'Ჽ' => 'ჽ', 'Ჾ' => 'ჾ', 'Ჿ' => 'ჿ', 'Ḁ' => 'ḁ', 'Ḃ' => 'ḃ', 'Ḅ' => 'ḅ', 'Ḇ' => 'ḇ', 'Ḉ' => 'ḉ', 'Ḋ' => 'ḋ', 'Ḍ' => 'ḍ', 'Ḏ' => 'ḏ', 'Ḑ' => 'ḑ', 'Ḓ' => 'ḓ', 'Ḕ' => 'ḕ', 'Ḗ' => 'ḗ', 'Ḙ' => 'ḙ', 'Ḛ' => 'ḛ', 'Ḝ' => 'ḝ', 'Ḟ' => 'ḟ', 'Ḡ' => 'ḡ', 'Ḣ' => 'ḣ', 'Ḥ' => 'ḥ', 'Ḧ' => 'ḧ', 'Ḩ' => 'ḩ', 'Ḫ' => 'ḫ', 'Ḭ' => 'ḭ', 'Ḯ' => 'ḯ', 'Ḱ' => 'ḱ', 'Ḳ' => 'ḳ', 'Ḵ' => 'ḵ', 'Ḷ' => 'ḷ', 'Ḹ' => 'ḹ', 'Ḻ' => 'ḻ', 'Ḽ' => 'ḽ', 'Ḿ' => 'ḿ', 'Ṁ' => 'ṁ', 'Ṃ' => 'ṃ', 'Ṅ' => 'ṅ', 'Ṇ' => 'ṇ', 'Ṉ' => 'ṉ', 'Ṋ' => 'ṋ', 'Ṍ' => 'ṍ', 'Ṏ' => 'ṏ', 'Ṑ' => 'ṑ', 'Ṓ' => 'ṓ', 'Ṕ' => 'ṕ', 'Ṗ' => 'ṗ', 'Ṙ' => 'ṙ', 'Ṛ' => 'ṛ', 'Ṝ' => 'ṝ', 'Ṟ' => 'ṟ', 'Ṡ' => 'ṡ', 'Ṣ' => 'ṣ', 'Ṥ' => 'ṥ', 'Ṧ' => 'ṧ', 'Ṩ' => 'ṩ', 'Ṫ' => 'ṫ', 'Ṭ' => 'ṭ', 'Ṯ' => 'ṯ', 'Ṱ' => 'ṱ', 'Ṳ' => 'ṳ', 'Ṵ' => 'ṵ', 'Ṷ' => 'ṷ', 'Ṹ' => 'ṹ', 'Ṻ' => 'ṻ', 'Ṽ' => 'ṽ', 'Ṿ' => 'ṿ', 'Ẁ' => 'ẁ', 'Ẃ' => 'ẃ', 'Ẅ' => 'ẅ', 'Ẇ' => 'ẇ', 'Ẉ' => 'ẉ', 'Ẋ' => 'ẋ', 'Ẍ' => 'ẍ', 'Ẏ' => 'ẏ', 'Ẑ' => 'ẑ', 'Ẓ' => 'ẓ', 'Ẕ' => 'ẕ', 'ẞ' => 'ß', 'Ạ' => 'ạ', 'Ả' => 'ả', 'Ấ' => 'ấ', 'Ầ' => 'ầ', 'Ẩ' => 'ẩ', 'Ẫ' => 'ẫ', 'Ậ' => 'ậ', 'Ắ' => 'ắ', 'Ằ' => 'ằ', 'Ẳ' => 'ẳ', 'Ẵ' => 'ẵ', 'Ặ' => 'ặ', 'Ẹ' => 'ẹ', 'Ẻ' => 'ẻ', 'Ẽ' => 'ẽ', 'Ế' => 'ế', 'Ề' => 'ề', 'Ể' => 'ể', 'Ễ' => 'ễ', 'Ệ' => 'ệ', 'Ỉ' => 'ỉ', 'Ị' => 'ị', 'Ọ' => 'ọ', 'Ỏ' => 'ỏ', 'Ố' => 'ố', 'Ồ' => 'ồ', 'Ổ' => 'ổ', 'Ỗ' => 'ỗ', 'Ộ' => 'ộ', 'Ớ' => 'ớ', 'Ờ' => 'ờ', 'Ở' => 'ở', 'Ỡ' => 'ỡ', 'Ợ' => 'ợ', 'Ụ' => 'ụ', 'Ủ' => 'ủ', 'Ứ' => 'ứ', 'Ừ' => 'ừ', 'Ử' => 'ử', 'Ữ' => 'ữ', 'Ự' => 'ự', 'Ỳ' => 'ỳ', 'Ỵ' => 'ỵ', 'Ỷ' => 'ỷ', 'Ỹ' => 'ỹ', 'Ỻ' => 'ỻ', 'Ỽ' => 'ỽ', 'Ỿ' => 'ỿ', 'Ἀ' => 'ἀ', 'Ἁ' => 'ἁ', 'Ἂ' => 'ἂ', 'Ἃ' => 'ἃ', 'Ἄ' => 'ἄ', 'Ἅ' => 'ἅ', 'Ἆ' => 'ἆ', 'Ἇ' => 'ἇ', 'Ἐ' => 'ἐ', 'Ἑ' => 'ἑ', 'Ἒ' => 'ἒ', 'Ἓ' => 'ἓ', 'Ἔ' => 'ἔ', 'Ἕ' => 'ἕ', 'Ἠ' => 'ἠ', 'Ἡ' => 'ἡ', 'Ἢ' => 'ἢ', 'Ἣ' => 'ἣ', 'Ἤ' => 'ἤ', 'Ἥ' => 'ἥ', 'Ἦ' => 'ἦ', 'Ἧ' => 'ἧ', 'Ἰ' => 'ἰ', 'Ἱ' => 'ἱ', 'Ἲ' => 'ἲ', 'Ἳ' => 'ἳ', 'Ἴ' => 'ἴ', 'Ἵ' => 'ἵ', 'Ἶ' => 'ἶ', 'Ἷ' => 'ἷ', 'Ὀ' => 'ὀ', 'Ὁ' => 'ὁ', 'Ὂ' => 'ὂ', 'Ὃ' => 'ὃ', 'Ὄ' => 'ὄ', 'Ὅ' => 'ὅ', 'Ὑ' => 'ὑ', 'Ὓ' => 'ὓ', 'Ὕ' => 'ὕ', 'Ὗ' => 'ὗ', 'Ὠ' => 'ὠ', 'Ὡ' => 'ὡ', 'Ὢ' => 'ὢ', 'Ὣ' => 'ὣ', 'Ὤ' => 'ὤ', 'Ὥ' => 'ὥ', 'Ὦ' => 'ὦ', 'Ὧ' => 'ὧ', 'ᾈ' => 'ᾀ', 'ᾉ' => 'ᾁ', 'ᾊ' => 'ᾂ', 'ᾋ' => 'ᾃ', 'ᾌ' => 'ᾄ', 'ᾍ' => 'ᾅ', 'ᾎ' => 'ᾆ', 'ᾏ' => 'ᾇ', 'ᾘ' => 'ᾐ', 'ᾙ' => 'ᾑ', 'ᾚ' => 'ᾒ', 'ᾛ' => 'ᾓ', 'ᾜ' => 'ᾔ', 'ᾝ' => 'ᾕ', 'ᾞ' => 'ᾖ', 'ᾟ' => 'ᾗ', 'ᾨ' => 'ᾠ', 'ᾩ' => 'ᾡ', 'ᾪ' => 'ᾢ', 'ᾫ' => 'ᾣ', 'ᾬ' => 'ᾤ', 'ᾭ' => 'ᾥ', 'ᾮ' => 'ᾦ', 'ᾯ' => 'ᾧ', 'Ᾰ' => 'ᾰ', 'Ᾱ' => 'ᾱ', 'Ὰ' => 'ὰ', 'Ά' => 'ά', 'ᾼ' => 'ᾳ', 'Ὲ' => 'ὲ', 'Έ' => 'έ', 'Ὴ' => 'ὴ', 'Ή' => 'ή', 'ῌ' => 'ῃ', 'Ῐ' => 'ῐ', 'Ῑ' => 'ῑ', 'Ὶ' => 'ὶ', 'Ί' => 'ί', 'Ῠ' => 'ῠ', 'Ῡ' => 'ῡ', 'Ὺ' => 'ὺ', 'Ύ' => 'ύ', 'Ῥ' => 'ῥ', 'Ὸ' => 'ὸ', 'Ό' => 'ό', 'Ὼ' => 'ὼ', 'Ώ' => 'ώ', 'ῼ' => 'ῳ', 'Ω' => 'ω', 'K' => 'k', 'Å' => 'å', 'Ⅎ' => 'ⅎ', 'Ⅰ' => 'ⅰ', 'Ⅱ' => 'ⅱ', 'Ⅲ' => 'ⅲ', 'Ⅳ' => 'ⅳ', 'Ⅴ' => 'ⅴ', 'Ⅵ' => 'ⅵ', 'Ⅶ' => 'ⅶ', 'Ⅷ' => 'ⅷ', 'Ⅸ' => 'ⅸ', 'Ⅹ' => 'ⅹ', 'Ⅺ' => 'ⅺ', 'Ⅻ' => 'ⅻ', 'Ⅼ' => 'ⅼ', 'Ⅽ' => 'ⅽ', 'Ⅾ' => 'ⅾ', 'Ⅿ' => 'ⅿ', 'Ↄ' => 'ↄ', 'Ⓐ' => 'ⓐ', 'Ⓑ' => 'ⓑ', 'Ⓒ' => 'ⓒ', 'Ⓓ' => 'ⓓ', 'Ⓔ' => 'ⓔ', 'Ⓕ' => 'ⓕ', 'Ⓖ' => 'ⓖ', 'Ⓗ' => 'ⓗ', 'Ⓘ' => 'ⓘ', 'Ⓙ' => 'ⓙ', 'Ⓚ' => 'ⓚ', 'Ⓛ' => 'ⓛ', 'Ⓜ' => 'ⓜ', 'Ⓝ' => 'ⓝ', 'Ⓞ' => 'ⓞ', 'Ⓟ' => 'ⓟ', 'Ⓠ' => 'ⓠ', 'Ⓡ' => 'ⓡ', 'Ⓢ' => 'ⓢ', 'Ⓣ' => 'ⓣ', 'Ⓤ' => 'ⓤ', 'Ⓥ' => 'ⓥ', 'Ⓦ' => 'ⓦ', 'Ⓧ' => 'ⓧ', 'Ⓨ' => 'ⓨ', 'Ⓩ' => 'ⓩ', 'Ⰰ' => 'ⰰ', 'Ⰱ' => 'ⰱ', 'Ⰲ' => 'ⰲ', 'Ⰳ' => 'ⰳ', 'Ⰴ' => 'ⰴ', 'Ⰵ' => 'ⰵ', 'Ⰶ' => 'ⰶ', 'Ⰷ' => 'ⰷ', 'Ⰸ' => 'ⰸ', 'Ⰹ' => 'ⰹ', 'Ⰺ' => 'ⰺ', 'Ⰻ' => 'ⰻ', 'Ⰼ' => 'ⰼ', 'Ⰽ' => 'ⰽ', 'Ⰾ' => 'ⰾ', 'Ⰿ' => 'ⰿ', 'Ⱀ' => 'ⱀ', 'Ⱁ' => 'ⱁ', 'Ⱂ' => 'ⱂ', 'Ⱃ' => 'ⱃ', 'Ⱄ' => 'ⱄ', 'Ⱅ' => 'ⱅ', 'Ⱆ' => 'ⱆ', 'Ⱇ' => 'ⱇ', 'Ⱈ' => 'ⱈ', 'Ⱉ' => 'ⱉ', 'Ⱊ' => 'ⱊ', 'Ⱋ' => 'ⱋ', 'Ⱌ' => 'ⱌ', 'Ⱍ' => 'ⱍ', 'Ⱎ' => 'ⱎ', 'Ⱏ' => 'ⱏ', 'Ⱐ' => 'ⱐ', 'Ⱑ' => 'ⱑ', 'Ⱒ' => 'ⱒ', 'Ⱓ' => 'ⱓ', 'Ⱔ' => 'ⱔ', 'Ⱕ' => 'ⱕ', 'Ⱖ' => 'ⱖ', 'Ⱗ' => 'ⱗ', 'Ⱘ' => 'ⱘ', 'Ⱙ' => 'ⱙ', 'Ⱚ' => 'ⱚ', 'Ⱛ' => 'ⱛ', 'Ⱜ' => 'ⱜ', 'Ⱝ' => 'ⱝ', 'Ⱞ' => 'ⱞ', 'Ⱡ' => 'ⱡ', 'Ɫ' => 'ɫ', 'Ᵽ' => 'ᵽ', 'Ɽ' => 'ɽ', 'Ⱨ' => 'ⱨ', 'Ⱪ' => 'ⱪ', 'Ⱬ' => 'ⱬ', 'Ɑ' => 'ɑ', 'Ɱ' => 'ɱ', 'Ɐ' => 'ɐ', 'Ɒ' => 'ɒ', 'Ⱳ' => 'ⱳ', 'Ⱶ' => 'ⱶ', 'Ȿ' => 'ȿ', 'Ɀ' => 'ɀ', 'Ⲁ' => 'ⲁ', 'Ⲃ' => 'ⲃ', 'Ⲅ' => 'ⲅ', 'Ⲇ' => 'ⲇ', 'Ⲉ' => 'ⲉ', 'Ⲋ' => 'ⲋ', 'Ⲍ' => 'ⲍ', 'Ⲏ' => 'ⲏ', 'Ⲑ' => 'ⲑ', 'Ⲓ' => 'ⲓ', 'Ⲕ' => 'ⲕ', 'Ⲗ' => 'ⲗ', 'Ⲙ' => 'ⲙ', 'Ⲛ' => 'ⲛ', 'Ⲝ' => 'ⲝ', 'Ⲟ' => 'ⲟ', 'Ⲡ' => 'ⲡ', 'Ⲣ' => 'ⲣ', 'Ⲥ' => 'ⲥ', 'Ⲧ' => 'ⲧ', 'Ⲩ' => 'ⲩ', 'Ⲫ' => 'ⲫ', 'Ⲭ' => 'ⲭ', 'Ⲯ' => 'ⲯ', 'Ⲱ' => 'ⲱ', 'Ⲳ' => 'ⲳ', 'Ⲵ' => 'ⲵ', 'Ⲷ' => 'ⲷ', 'Ⲹ' => 'ⲹ', 'Ⲻ' => 'ⲻ', 'Ⲽ' => 'ⲽ', 'Ⲿ' => 'ⲿ', 'Ⳁ' => 'ⳁ', 'Ⳃ' => 'ⳃ', 'Ⳅ' => 'ⳅ', 'Ⳇ' => 'ⳇ', 'Ⳉ' => 'ⳉ', 'Ⳋ' => 'ⳋ', 'Ⳍ' => 'ⳍ', 'Ⳏ' => 'ⳏ', 'Ⳑ' => 'ⳑ', 'Ⳓ' => 'ⳓ', 'Ⳕ' => 'ⳕ', 'Ⳗ' => 'ⳗ', 'Ⳙ' => 'ⳙ', 'Ⳛ' => 'ⳛ', 'Ⳝ' => 'ⳝ', 'Ⳟ' => 'ⳟ', 'Ⳡ' => 'ⳡ', 'Ⳣ' => 'ⳣ', 'Ⳬ' => 'ⳬ', 'Ⳮ' => 'ⳮ', 'Ⳳ' => 'ⳳ', 'Ꙁ' => 'ꙁ', 'Ꙃ' => 'ꙃ', 'Ꙅ' => 'ꙅ', 'Ꙇ' => 'ꙇ', 'Ꙉ' => 'ꙉ', 'Ꙋ' => 'ꙋ', 'Ꙍ' => 'ꙍ', 'Ꙏ' => 'ꙏ', 'Ꙑ' => 'ꙑ', 'Ꙓ' => 'ꙓ', 'Ꙕ' => 'ꙕ', 'Ꙗ' => 'ꙗ', 'Ꙙ' => 'ꙙ', 'Ꙛ' => 'ꙛ', 'Ꙝ' => 'ꙝ', 'Ꙟ' => 'ꙟ', 'Ꙡ' => 'ꙡ', 'Ꙣ' => 'ꙣ', 'Ꙥ' => 'ꙥ', 'Ꙧ' => 'ꙧ', 'Ꙩ' => 'ꙩ', 'Ꙫ' => 'ꙫ', 'Ꙭ' => 'ꙭ', 'Ꚁ' => 'ꚁ', 'Ꚃ' => 'ꚃ', 'Ꚅ' => 'ꚅ', 'Ꚇ' => 'ꚇ', 'Ꚉ' => 'ꚉ', 'Ꚋ' => 'ꚋ', 'Ꚍ' => 'ꚍ', 'Ꚏ' => 'ꚏ', 'Ꚑ' => 'ꚑ', 'Ꚓ' => 'ꚓ', 'Ꚕ' => 'ꚕ', 'Ꚗ' => 'ꚗ', 'Ꚙ' => 'ꚙ', 'Ꚛ' => 'ꚛ', 'Ꜣ' => 'ꜣ', 'Ꜥ' => 'ꜥ', 'Ꜧ' => 'ꜧ', 'Ꜩ' => 'ꜩ', 'Ꜫ' => 'ꜫ', 'Ꜭ' => 'ꜭ', 'Ꜯ' => 'ꜯ', 'Ꜳ' => 'ꜳ', 'Ꜵ' => 'ꜵ', 'Ꜷ' => 'ꜷ', 'Ꜹ' => 'ꜹ', 'Ꜻ' => 'ꜻ', 'Ꜽ' => 'ꜽ', 'Ꜿ' => 'ꜿ', 'Ꝁ' => 'ꝁ', 'Ꝃ' => 'ꝃ', 'Ꝅ' => 'ꝅ', 'Ꝇ' => 'ꝇ', 'Ꝉ' => 'ꝉ', 'Ꝋ' => 'ꝋ', 'Ꝍ' => 'ꝍ', 'Ꝏ' => 'ꝏ', 'Ꝑ' => 'ꝑ', 'Ꝓ' => 'ꝓ', 'Ꝕ' => 'ꝕ', 'Ꝗ' => 'ꝗ', 'Ꝙ' => 'ꝙ', 'Ꝛ' => 'ꝛ', 'Ꝝ' => 'ꝝ', 'Ꝟ' => 'ꝟ', 'Ꝡ' => 'ꝡ', 'Ꝣ' => 'ꝣ', 'Ꝥ' => 'ꝥ', 'Ꝧ' => 'ꝧ', 'Ꝩ' => 'ꝩ', 'Ꝫ' => 'ꝫ', 'Ꝭ' => 'ꝭ', 'Ꝯ' => 'ꝯ', 'Ꝺ' => 'ꝺ', 'Ꝼ' => 'ꝼ', 'Ᵹ' => 'ᵹ', 'Ꝿ' => 'ꝿ', 'Ꞁ' => 'ꞁ', 'Ꞃ' => 'ꞃ', 'Ꞅ' => 'ꞅ', 'Ꞇ' => 'ꞇ', 'Ꞌ' => 'ꞌ', 'Ɥ' => 'ɥ', 'Ꞑ' => 'ꞑ', 'Ꞓ' => 'ꞓ', 'Ꞗ' => 'ꞗ', 'Ꞙ' => 'ꞙ', 'Ꞛ' => 'ꞛ', 'Ꞝ' => 'ꞝ', 'Ꞟ' => 'ꞟ', 'Ꞡ' => 'ꞡ', 'Ꞣ' => 'ꞣ', 'Ꞥ' => 'ꞥ', 'Ꞧ' => 'ꞧ', 'Ꞩ' => 'ꞩ', 'Ɦ' => 'ɦ', 'Ɜ' => 'ɜ', 'Ɡ' => 'ɡ', 'Ɬ' => 'ɬ', 'Ɪ' => 'ɪ', 'Ʞ' => 'ʞ', 'Ʇ' => 'ʇ', 'Ʝ' => 'ʝ', 'Ꭓ' => 'ꭓ', 'Ꞵ' => 'ꞵ', 'Ꞷ' => 'ꞷ', 'Ꞹ' => 'ꞹ', 'Ꞻ' => 'ꞻ', 'Ꞽ' => 'ꞽ', 'Ꞿ' => 'ꞿ', 'Ꟃ' => 'ꟃ', 'Ꞔ' => 'ꞔ', 'Ʂ' => 'ʂ', 'Ᶎ' => 'ᶎ', 'Ꟈ' => 'ꟈ', 'Ꟊ' => 'ꟊ', 'Ꟶ' => 'ꟶ', 'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', '𐐀' => '𐐨', '𐐁' => '𐐩', '𐐂' => '𐐪', '𐐃' => '𐐫', '𐐄' => '𐐬', '𐐅' => '𐐭', '𐐆' => '𐐮', '𐐇' => '𐐯', '𐐈' => '𐐰', '𐐉' => '𐐱', '𐐊' => '𐐲', '𐐋' => '𐐳', '𐐌' => '𐐴', '𐐍' => '𐐵', '𐐎' => '𐐶', '𐐏' => '𐐷', '𐐐' => '𐐸', '𐐑' => '𐐹', '𐐒' => '𐐺', '𐐓' => '𐐻', '𐐔' => '𐐼', '𐐕' => '𐐽', '𐐖' => '𐐾', '𐐗' => '𐐿', '𐐘' => '𐑀', '𐐙' => '𐑁', '𐐚' => '𐑂', '𐐛' => '𐑃', '𐐜' => '𐑄', '𐐝' => '𐑅', '𐐞' => '𐑆', '𐐟' => '𐑇', '𐐠' => '𐑈', '𐐡' => '𐑉', '𐐢' => '𐑊', '𐐣' => '𐑋', '𐐤' => '𐑌', '𐐥' => '𐑍', '𐐦' => '𐑎', '𐐧' => '𐑏', '𐒰' => '𐓘', '𐒱' => '𐓙', '𐒲' => '𐓚', '𐒳' => '𐓛', '𐒴' => '𐓜', '𐒵' => '𐓝', '𐒶' => '𐓞', '𐒷' => '𐓟', '𐒸' => '𐓠', '𐒹' => '𐓡', '𐒺' => '𐓢', '𐒻' => '𐓣', '𐒼' => '𐓤', '𐒽' => '𐓥', '𐒾' => '𐓦', '𐒿' => '𐓧', '𐓀' => '𐓨', '𐓁' => '𐓩', '𐓂' => '𐓪', '𐓃' => '𐓫', '𐓄' => '𐓬', '𐓅' => '𐓭', '𐓆' => '𐓮', '𐓇' => '𐓯', '𐓈' => '𐓰', '𐓉' => '𐓱', '𐓊' => '𐓲', '𐓋' => '𐓳', '𐓌' => '𐓴', '𐓍' => '𐓵', '𐓎' => '𐓶', '𐓏' => '𐓷', '𐓐' => '𐓸', '𐓑' => '𐓹', '𐓒' => '𐓺', '𐓓' => '𐓻', '𐲀' => '𐳀', '𐲁' => '𐳁', '𐲂' => '𐳂', '𐲃' => '𐳃', '𐲄' => '𐳄', '𐲅' => '𐳅', '𐲆' => '𐳆', '𐲇' => '𐳇', '𐲈' => '𐳈', '𐲉' => '𐳉', '𐲊' => '𐳊', '𐲋' => '𐳋', '𐲌' => '𐳌', '𐲍' => '𐳍', '𐲎' => '𐳎', '𐲏' => '𐳏', '𐲐' => '𐳐', '𐲑' => '𐳑', '𐲒' => '𐳒', '𐲓' => '𐳓', '𐲔' => '𐳔', '𐲕' => '𐳕', '𐲖' => '𐳖', '𐲗' => '𐳗', '𐲘' => '𐳘', '𐲙' => '𐳙', '𐲚' => '𐳚', '𐲛' => '𐳛', '𐲜' => '𐳜', '𐲝' => '𐳝', '𐲞' => '𐳞', '𐲟' => '𐳟', '𐲠' => '𐳠', '𐲡' => '𐳡', '𐲢' => '𐳢', '𐲣' => '𐳣', '𐲤' => '𐳤', '𐲥' => '𐳥', '𐲦' => '𐳦', '𐲧' => '𐳧', '𐲨' => '𐳨', '𐲩' => '𐳩', '𐲪' => '𐳪', '𐲫' => '𐳫', '𐲬' => '𐳬', '𐲭' => '𐳭', '𐲮' => '𐳮', '𐲯' => '𐳯', '𐲰' => '𐳰', '𐲱' => '𐳱', '𐲲' => '𐳲', '𑢠' => '𑣀', '𑢡' => '𑣁', '𑢢' => '𑣂', '𑢣' => '𑣃', '𑢤' => '𑣄', '𑢥' => '𑣅', '𑢦' => '𑣆', '𑢧' => '𑣇', '𑢨' => '𑣈', '𑢩' => '𑣉', '𑢪' => '𑣊', '𑢫' => '𑣋', '𑢬' => '𑣌', '𑢭' => '𑣍', '𑢮' => '𑣎', '𑢯' => '𑣏', '𑢰' => '𑣐', '𑢱' => '𑣑', '𑢲' => '𑣒', '𑢳' => '𑣓', '𑢴' => '𑣔', '𑢵' => '𑣕', '𑢶' => '𑣖', '𑢷' => '𑣗', '𑢸' => '𑣘', '𑢹' => '𑣙', '𑢺' => '𑣚', '𑢻' => '𑣛', '𑢼' => '𑣜', '𑢽' => '𑣝', '𑢾' => '𑣞', '𑢿' => '𑣟', '𖹀' => '𖹠', '𖹁' => '𖹡', '𖹂' => '𖹢', '𖹃' => '𖹣', '𖹄' => '𖹤', '𖹅' => '𖹥', '𖹆' => '𖹦', '𖹇' => '𖹧', '𖹈' => '𖹨', '𖹉' => '𖹩', '𖹊' => '𖹪', '𖹋' => '𖹫', '𖹌' => '𖹬', '𖹍' => '𖹭', '𖹎' => '𖹮', '𖹏' => '𖹯', '𖹐' => '𖹰', '𖹑' => '𖹱', '𖹒' => '𖹲', '𖹓' => '𖹳', '𖹔' => '𖹴', '𖹕' => '𖹵', '𖹖' => '𖹶', '𖹗' => '𖹷', '𖹘' => '𖹸', '𖹙' => '𖹹', '𖹚' => '𖹺', '𖹛' => '𖹻', '𖹜' => '𖹼', '𖹝' => '𖹽', '𖹞' => '𖹾', '𖹟' => '𖹿', '𞤀' => '𞤢', '𞤁' => '𞤣', '𞤂' => '𞤤', '𞤃' => '𞤥', '𞤄' => '𞤦', '𞤅' => '𞤧', '𞤆' => '𞤨', '𞤇' => '𞤩', '𞤈' => '𞤪', '𞤉' => '𞤫', '𞤊' => '𞤬', '𞤋' => '𞤭', '𞤌' => '𞤮', '𞤍' => '𞤯', '𞤎' => '𞤰', '𞤏' => '𞤱', '𞤐' => '𞤲', '𞤑' => '𞤳', '𞤒' => '𞤴', '𞤓' => '𞤵', '𞤔' => '𞤶', '𞤕' => '𞤷', '𞤖' => '𞤸', '𞤗' => '𞤹', '𞤘' => '𞤺', '𞤙' => '𞤻', '𞤚' => '𞤼', '𞤛' => '𞤽', '𞤜' => '𞤾', '𞤝' => '𞤿', '𞤞' => '𞥀', '𞤟' => '𞥁', '𞤠' => '𞥂', '𞤡' => '𞥃'); diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php new file mode 100644 index 00000000..292cb42b --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php @@ -0,0 +1,6 @@ + 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', 'µ' => 'Μ', 'à' => 'À', 'á' => 'Á', 'â' => 'Â', 'ã' => 'Ã', 'ä' => 'Ä', 'å' => 'Å', 'æ' => 'Æ', 'ç' => 'Ç', 'è' => 'È', 'é' => 'É', 'ê' => 'Ê', 'ë' => 'Ë', 'ì' => 'Ì', 'í' => 'Í', 'î' => 'Î', 'ï' => 'Ï', 'ð' => 'Ð', 'ñ' => 'Ñ', 'ò' => 'Ò', 'ó' => 'Ó', 'ô' => 'Ô', 'õ' => 'Õ', 'ö' => 'Ö', 'ø' => 'Ø', 'ù' => 'Ù', 'ú' => 'Ú', 'û' => 'Û', 'ü' => 'Ü', 'ý' => 'Ý', 'þ' => 'Þ', 'ÿ' => 'Ÿ', 'ā' => 'Ā', 'ă' => 'Ă', 'ą' => 'Ą', 'ć' => 'Ć', 'ĉ' => 'Ĉ', 'ċ' => 'Ċ', 'č' => 'Č', 'ď' => 'Ď', 'đ' => 'Đ', 'ē' => 'Ē', 'ĕ' => 'Ĕ', 'ė' => 'Ė', 'ę' => 'Ę', 'ě' => 'Ě', 'ĝ' => 'Ĝ', 'ğ' => 'Ğ', 'ġ' => 'Ġ', 'ģ' => 'Ģ', 'ĥ' => 'Ĥ', 'ħ' => 'Ħ', 'ĩ' => 'Ĩ', 'ī' => 'Ī', 'ĭ' => 'Ĭ', 'į' => 'Į', 'ı' => 'I', 'ij' => 'IJ', 'ĵ' => 'Ĵ', 'ķ' => 'Ķ', 'ĺ' => 'Ĺ', 'ļ' => 'Ļ', 'ľ' => 'Ľ', 'ŀ' => 'Ŀ', 'ł' => 'Ł', 'ń' => 'Ń', 'ņ' => 'Ņ', 'ň' => 'Ň', 'ŋ' => 'Ŋ', 'ō' => 'Ō', 'ŏ' => 'Ŏ', 'ő' => 'Ő', 'œ' => 'Œ', 'ŕ' => 'Ŕ', 'ŗ' => 'Ŗ', 'ř' => 'Ř', 'ś' => 'Ś', 'ŝ' => 'Ŝ', 'ş' => 'Ş', 'š' => 'Š', 'ţ' => 'Ţ', 'ť' => 'Ť', 'ŧ' => 'Ŧ', 'ũ' => 'Ũ', 'ū' => 'Ū', 'ŭ' => 'Ŭ', 'ů' => 'Ů', 'ű' => 'Ű', 'ų' => 'Ų', 'ŵ' => 'Ŵ', 'ŷ' => 'Ŷ', 'ź' => 'Ź', 'ż' => 'Ż', 'ž' => 'Ž', 'ſ' => 'S', 'ƀ' => 'Ƀ', 'ƃ' => 'Ƃ', 'ƅ' => 'Ƅ', 'ƈ' => 'Ƈ', 'ƌ' => 'Ƌ', 'ƒ' => 'Ƒ', 'ƕ' => 'Ƕ', 'ƙ' => 'Ƙ', 'ƚ' => 'Ƚ', 'ƞ' => 'Ƞ', 'ơ' => 'Ơ', 'ƣ' => 'Ƣ', 'ƥ' => 'Ƥ', 'ƨ' => 'Ƨ', 'ƭ' => 'Ƭ', 'ư' => 'Ư', 'ƴ' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'ƿ' => 'Ƿ', 'Dž' => 'DŽ', 'dž' => 'DŽ', 'Lj' => 'LJ', 'lj' => 'LJ', 'Nj' => 'NJ', 'nj' => 'NJ', 'ǎ' => 'Ǎ', 'ǐ' => 'Ǐ', 'ǒ' => 'Ǒ', 'ǔ' => 'Ǔ', 'ǖ' => 'Ǖ', 'ǘ' => 'Ǘ', 'ǚ' => 'Ǚ', 'ǜ' => 'Ǜ', 'ǝ' => 'Ǝ', 'ǟ' => 'Ǟ', 'ǡ' => 'Ǡ', 'ǣ' => 'Ǣ', 'ǥ' => 'Ǥ', 'ǧ' => 'Ǧ', 'ǩ' => 'Ǩ', 'ǫ' => 'Ǫ', 'ǭ' => 'Ǭ', 'ǯ' => 'Ǯ', 'Dz' => 'DZ', 'dz' => 'DZ', 'ǵ' => 'Ǵ', 'ǹ' => 'Ǹ', 'ǻ' => 'Ǻ', 'ǽ' => 'Ǽ', 'ǿ' => 'Ǿ', 'ȁ' => 'Ȁ', 'ȃ' => 'Ȃ', 'ȅ' => 'Ȅ', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'ȋ' => 'Ȋ', 'ȍ' => 'Ȍ', 'ȏ' => 'Ȏ', 'ȑ' => 'Ȑ', 'ȓ' => 'Ȓ', 'ȕ' => 'Ȕ', 'ȗ' => 'Ȗ', 'ș' => 'Ș', 'ț' => 'Ț', 'ȝ' => 'Ȝ', 'ȟ' => 'Ȟ', 'ȣ' => 'Ȣ', 'ȥ' => 'Ȥ', 'ȧ' => 'Ȧ', 'ȩ' => 'Ȩ', 'ȫ' => 'Ȫ', 'ȭ' => 'Ȭ', 'ȯ' => 'Ȯ', 'ȱ' => 'Ȱ', 'ȳ' => 'Ȳ', 'ȼ' => 'Ȼ', 'ȿ' => 'Ȿ', 'ɀ' => 'Ɀ', 'ɂ' => 'Ɂ', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'ɋ' => 'Ɋ', 'ɍ' => 'Ɍ', 'ɏ' => 'Ɏ', 'ɐ' => 'Ɐ', 'ɑ' => 'Ɑ', 'ɒ' => 'Ɒ', 'ɓ' => 'Ɓ', 'ɔ' => 'Ɔ', 'ɖ' => 'Ɖ', 'ɗ' => 'Ɗ', 'ə' => 'Ə', 'ɛ' => 'Ɛ', 'ɜ' => 'Ɜ', 'ɠ' => 'Ɠ', 'ɡ' => 'Ɡ', 'ɣ' => 'Ɣ', 'ɥ' => 'Ɥ', 'ɦ' => 'Ɦ', 'ɨ' => 'Ɨ', 'ɩ' => 'Ɩ', 'ɪ' => 'Ɪ', 'ɫ' => 'Ɫ', 'ɬ' => 'Ɬ', 'ɯ' => 'Ɯ', 'ɱ' => 'Ɱ', 'ɲ' => 'Ɲ', 'ɵ' => 'Ɵ', 'ɽ' => 'Ɽ', 'ʀ' => 'Ʀ', 'ʂ' => 'Ʂ', 'ʃ' => 'Ʃ', 'ʇ' => 'Ʇ', 'ʈ' => 'Ʈ', 'ʉ' => 'Ʉ', 'ʊ' => 'Ʊ', 'ʋ' => 'Ʋ', 'ʌ' => 'Ʌ', 'ʒ' => 'Ʒ', 'ʝ' => 'Ʝ', 'ʞ' => 'Ʞ', 'ͅ' => 'Ι', 'ͱ' => 'Ͱ', 'ͳ' => 'Ͳ', 'ͷ' => 'Ͷ', 'ͻ' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ͽ', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Β', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Μ', 'ν' => 'Ν', 'ξ' => 'Ξ', 'ο' => 'Ο', 'π' => 'Π', 'ρ' => 'Ρ', 'ς' => 'Σ', 'σ' => 'Σ', 'τ' => 'Τ', 'υ' => 'Υ', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ϊ' => 'Ϊ', 'ϋ' => 'Ϋ', 'ό' => 'Ό', 'ύ' => 'Ύ', 'ώ' => 'Ώ', 'ϐ' => 'Β', 'ϑ' => 'Θ', 'ϕ' => 'Φ', 'ϖ' => 'Π', 'ϗ' => 'Ϗ', 'ϙ' => 'Ϙ', 'ϛ' => 'Ϛ', 'ϝ' => 'Ϝ', 'ϟ' => 'Ϟ', 'ϡ' => 'Ϡ', 'ϣ' => 'Ϣ', 'ϥ' => 'Ϥ', 'ϧ' => 'Ϧ', 'ϩ' => 'Ϩ', 'ϫ' => 'Ϫ', 'ϭ' => 'Ϭ', 'ϯ' => 'Ϯ', 'ϰ' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Ϳ', 'ϵ' => 'Ε', 'ϸ' => 'Ϸ', 'ϻ' => 'Ϻ', 'а' => 'А', 'б' => 'Б', 'в' => 'В', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'М', 'н' => 'Н', 'о' => 'О', 'п' => 'П', 'р' => 'Р', 'с' => 'С', 'т' => 'Т', 'у' => 'У', 'ф' => 'Ф', 'х' => 'Х', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ъ' => 'Ъ', 'ы' => 'Ы', 'ь' => 'Ь', 'э' => 'Э', 'ю' => 'Ю', 'я' => 'Я', 'ѐ' => 'Ѐ', 'ё' => 'Ё', 'ђ' => 'Ђ', 'ѓ' => 'Ѓ', 'є' => 'Є', 'ѕ' => 'Ѕ', 'і' => 'І', 'ї' => 'Ї', 'ј' => 'Ј', 'љ' => 'Љ', 'њ' => 'Њ', 'ћ' => 'Ћ', 'ќ' => 'Ќ', 'ѝ' => 'Ѝ', 'ў' => 'Ў', 'џ' => 'Џ', 'ѡ' => 'Ѡ', 'ѣ' => 'Ѣ', 'ѥ' => 'Ѥ', 'ѧ' => 'Ѧ', 'ѩ' => 'Ѩ', 'ѫ' => 'Ѫ', 'ѭ' => 'Ѭ', 'ѯ' => 'Ѯ', 'ѱ' => 'Ѱ', 'ѳ' => 'Ѳ', 'ѵ' => 'Ѵ', 'ѷ' => 'Ѷ', 'ѹ' => 'Ѹ', 'ѻ' => 'Ѻ', 'ѽ' => 'Ѽ', 'ѿ' => 'Ѿ', 'ҁ' => 'Ҁ', 'ҋ' => 'Ҋ', 'ҍ' => 'Ҍ', 'ҏ' => 'Ҏ', 'ґ' => 'Ґ', 'ғ' => 'Ғ', 'ҕ' => 'Ҕ', 'җ' => 'Җ', 'ҙ' => 'Ҙ', 'қ' => 'Қ', 'ҝ' => 'Ҝ', 'ҟ' => 'Ҟ', 'ҡ' => 'Ҡ', 'ң' => 'Ң', 'ҥ' => 'Ҥ', 'ҧ' => 'Ҧ', 'ҩ' => 'Ҩ', 'ҫ' => 'Ҫ', 'ҭ' => 'Ҭ', 'ү' => 'Ү', 'ұ' => 'Ұ', 'ҳ' => 'Ҳ', 'ҵ' => 'Ҵ', 'ҷ' => 'Ҷ', 'ҹ' => 'Ҹ', 'һ' => 'Һ', 'ҽ' => 'Ҽ', 'ҿ' => 'Ҿ', 'ӂ' => 'Ӂ', 'ӄ' => 'Ӄ', 'ӆ' => 'Ӆ', 'ӈ' => 'Ӈ', 'ӊ' => 'Ӊ', 'ӌ' => 'Ӌ', 'ӎ' => 'Ӎ', 'ӏ' => 'Ӏ', 'ӑ' => 'Ӑ', 'ӓ' => 'Ӓ', 'ӕ' => 'Ӕ', 'ӗ' => 'Ӗ', 'ә' => 'Ә', 'ӛ' => 'Ӛ', 'ӝ' => 'Ӝ', 'ӟ' => 'Ӟ', 'ӡ' => 'Ӡ', 'ӣ' => 'Ӣ', 'ӥ' => 'Ӥ', 'ӧ' => 'Ӧ', 'ө' => 'Ө', 'ӫ' => 'Ӫ', 'ӭ' => 'Ӭ', 'ӯ' => 'Ӯ', 'ӱ' => 'Ӱ', 'ӳ' => 'Ӳ', 'ӵ' => 'Ӵ', 'ӷ' => 'Ӷ', 'ӹ' => 'Ӹ', 'ӻ' => 'Ӻ', 'ӽ' => 'Ӽ', 'ӿ' => 'Ӿ', 'ԁ' => 'Ԁ', 'ԃ' => 'Ԃ', 'ԅ' => 'Ԅ', 'ԇ' => 'Ԇ', 'ԉ' => 'Ԉ', 'ԋ' => 'Ԋ', 'ԍ' => 'Ԍ', 'ԏ' => 'Ԏ', 'ԑ' => 'Ԑ', 'ԓ' => 'Ԓ', 'ԕ' => 'Ԕ', 'ԗ' => 'Ԗ', 'ԙ' => 'Ԙ', 'ԛ' => 'Ԛ', 'ԝ' => 'Ԝ', 'ԟ' => 'Ԟ', 'ԡ' => 'Ԡ', 'ԣ' => 'Ԣ', 'ԥ' => 'Ԥ', 'ԧ' => 'Ԧ', 'ԩ' => 'Ԩ', 'ԫ' => 'Ԫ', 'ԭ' => 'Ԭ', 'ԯ' => 'Ԯ', 'ա' => 'Ա', 'բ' => 'Բ', 'գ' => 'Գ', 'դ' => 'Դ', 'ե' => 'Ե', 'զ' => 'Զ', 'է' => 'Է', 'ը' => 'Ը', 'թ' => 'Թ', 'ժ' => 'Ժ', 'ի' => 'Ի', 'լ' => 'Լ', 'խ' => 'Խ', 'ծ' => 'Ծ', 'կ' => 'Կ', 'հ' => 'Հ', 'ձ' => 'Ձ', 'ղ' => 'Ղ', 'ճ' => 'Ճ', 'մ' => 'Մ', 'յ' => 'Յ', 'ն' => 'Ն', 'շ' => 'Շ', 'ո' => 'Ո', 'չ' => 'Չ', 'պ' => 'Պ', 'ջ' => 'Ջ', 'ռ' => 'Ռ', 'ս' => 'Ս', 'վ' => 'Վ', 'տ' => 'Տ', 'ր' => 'Ր', 'ց' => 'Ց', 'ւ' => 'Ւ', 'փ' => 'Փ', 'ք' => 'Ք', 'օ' => 'Օ', 'ֆ' => 'Ֆ', 'ა' => 'Ა', 'ბ' => 'Ბ', 'გ' => 'Გ', 'დ' => 'Დ', 'ე' => 'Ე', 'ვ' => 'Ვ', 'ზ' => 'Ზ', 'თ' => 'Თ', 'ი' => 'Ი', 'კ' => 'Კ', 'ლ' => 'Ლ', 'მ' => 'Მ', 'ნ' => 'Ნ', 'ო' => 'Ო', 'პ' => 'Პ', 'ჟ' => 'Ჟ', 'რ' => 'Რ', 'ს' => 'Ს', 'ტ' => 'Ტ', 'უ' => 'Უ', 'ფ' => 'Ფ', 'ქ' => 'Ქ', 'ღ' => 'Ღ', 'ყ' => 'Ყ', 'შ' => 'Შ', 'ჩ' => 'Ჩ', 'ც' => 'Ც', 'ძ' => 'Ძ', 'წ' => 'Წ', 'ჭ' => 'Ჭ', 'ხ' => 'Ხ', 'ჯ' => 'Ჯ', 'ჰ' => 'Ჰ', 'ჱ' => 'Ჱ', 'ჲ' => 'Ჲ', 'ჳ' => 'Ჳ', 'ჴ' => 'Ჴ', 'ჵ' => 'Ჵ', 'ჶ' => 'Ჶ', 'ჷ' => 'Ჷ', 'ჸ' => 'Ჸ', 'ჹ' => 'Ჹ', 'ჺ' => 'Ჺ', 'ჽ' => 'Ჽ', 'ჾ' => 'Ჾ', 'ჿ' => 'Ჿ', 'ᏸ' => 'Ᏸ', 'ᏹ' => 'Ᏹ', 'ᏺ' => 'Ᏺ', 'ᏻ' => 'Ᏻ', 'ᏼ' => 'Ᏼ', 'ᏽ' => 'Ᏽ', 'ᲀ' => 'В', 'ᲁ' => 'Д', 'ᲂ' => 'О', 'ᲃ' => 'С', 'ᲄ' => 'Т', 'ᲅ' => 'Т', 'ᲆ' => 'Ъ', 'ᲇ' => 'Ѣ', 'ᲈ' => 'Ꙋ', 'ᵹ' => 'Ᵹ', 'ᵽ' => 'Ᵽ', 'ᶎ' => 'Ᶎ', 'ḁ' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'ḍ' => 'Ḍ', 'ḏ' => 'Ḏ', 'ḑ' => 'Ḑ', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'ḝ' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'ṁ' => 'Ṁ', 'ṃ' => 'Ṃ', 'ṅ' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'ṍ' => 'Ṍ', 'ṏ' => 'Ṏ', 'ṑ' => 'Ṑ', 'ṓ' => 'Ṓ', 'ṕ' => 'Ṕ', 'ṗ' => 'Ṗ', 'ṙ' => 'Ṙ', 'ṛ' => 'Ṛ', 'ṝ' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'Ṡ', 'ṣ' => 'Ṣ', 'ṥ' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'ṭ' => 'Ṭ', 'ṯ' => 'Ṯ', 'ṱ' => 'Ṱ', 'ṳ' => 'Ṳ', 'ṵ' => 'Ṵ', 'ṷ' => 'Ṷ', 'ṹ' => 'Ṹ', 'ṻ' => 'Ṻ', 'ṽ' => 'Ṽ', 'ṿ' => 'Ṿ', 'ẁ' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'ẍ' => 'Ẍ', 'ẏ' => 'Ẏ', 'ẑ' => 'Ẑ', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'Ṡ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'ề' => 'Ề', 'ể' => 'Ể', 'ễ' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'ọ' => 'Ọ', 'ỏ' => 'Ỏ', 'ố' => 'Ố', 'ồ' => 'Ồ', 'ổ' => 'Ổ', 'ỗ' => 'Ỗ', 'ộ' => 'Ộ', 'ớ' => 'Ớ', 'ờ' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'Ỡ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'ử' => 'Ử', 'ữ' => 'Ữ', 'ự' => 'Ự', 'ỳ' => 'Ỳ', 'ỵ' => 'Ỵ', 'ỷ' => 'Ỷ', 'ỹ' => 'Ỹ', 'ỻ' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'ἀ' => 'Ἀ', 'ἁ' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'ἅ' => 'Ἅ', 'ἆ' => 'Ἆ', 'ἇ' => 'Ἇ', 'ἐ' => 'Ἐ', 'ἑ' => 'Ἑ', 'ἒ' => 'Ἒ', 'ἓ' => 'Ἓ', 'ἔ' => 'Ἔ', 'ἕ' => 'Ἕ', 'ἠ' => 'Ἠ', 'ἡ' => 'Ἡ', 'ἢ' => 'Ἢ', 'ἣ' => 'Ἣ', 'ἤ' => 'Ἤ', 'ἥ' => 'Ἥ', 'ἦ' => 'Ἦ', 'ἧ' => 'Ἧ', 'ἰ' => 'Ἰ', 'ἱ' => 'Ἱ', 'ἲ' => 'Ἲ', 'ἳ' => 'Ἳ', 'ἴ' => 'Ἴ', 'ἵ' => 'Ἵ', 'ἶ' => 'Ἶ', 'ἷ' => 'Ἷ', 'ὀ' => 'Ὀ', 'ὁ' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'ὅ' => 'Ὅ', 'ὑ' => 'Ὑ', 'ὓ' => 'Ὓ', 'ὕ' => 'Ὕ', 'ὗ' => 'Ὗ', 'ὠ' => 'Ὠ', 'ὡ' => 'Ὡ', 'ὢ' => 'Ὢ', 'ὣ' => 'Ὣ', 'ὤ' => 'Ὤ', 'ὥ' => 'Ὥ', 'ὦ' => 'Ὦ', 'ὧ' => 'Ὧ', 'ὰ' => 'Ὰ', 'ά' => 'Ά', 'ὲ' => 'Ὲ', 'έ' => 'Έ', 'ὴ' => 'Ὴ', 'ή' => 'Ή', 'ὶ' => 'Ὶ', 'ί' => 'Ί', 'ὸ' => 'Ὸ', 'ό' => 'Ό', 'ὺ' => 'Ὺ', 'ύ' => 'Ύ', 'ὼ' => 'Ὼ', 'ώ' => 'Ώ', 'ᾀ' => 'ἈΙ', 'ᾁ' => 'ἉΙ', 'ᾂ' => 'ἊΙ', 'ᾃ' => 'ἋΙ', 'ᾄ' => 'ἌΙ', 'ᾅ' => 'ἍΙ', 'ᾆ' => 'ἎΙ', 'ᾇ' => 'ἏΙ', 'ᾐ' => 'ἨΙ', 'ᾑ' => 'ἩΙ', 'ᾒ' => 'ἪΙ', 'ᾓ' => 'ἫΙ', 'ᾔ' => 'ἬΙ', 'ᾕ' => 'ἭΙ', 'ᾖ' => 'ἮΙ', 'ᾗ' => 'ἯΙ', 'ᾠ' => 'ὨΙ', 'ᾡ' => 'ὩΙ', 'ᾢ' => 'ὪΙ', 'ᾣ' => 'ὫΙ', 'ᾤ' => 'ὬΙ', 'ᾥ' => 'ὭΙ', 'ᾦ' => 'ὮΙ', 'ᾧ' => 'ὯΙ', 'ᾰ' => 'Ᾰ', 'ᾱ' => 'Ᾱ', 'ᾳ' => 'ΑΙ', 'ι' => 'Ι', 'ῃ' => 'ΗΙ', 'ῐ' => 'Ῐ', 'ῑ' => 'Ῑ', 'ῠ' => 'Ῠ', 'ῡ' => 'Ῡ', 'ῥ' => 'Ῥ', 'ῳ' => 'ΩΙ', 'ⅎ' => 'Ⅎ', 'ⅰ' => 'Ⅰ', 'ⅱ' => 'Ⅱ', 'ⅲ' => 'Ⅲ', 'ⅳ' => 'Ⅳ', 'ⅴ' => 'Ⅴ', 'ⅵ' => 'Ⅵ', 'ⅶ' => 'Ⅶ', 'ⅷ' => 'Ⅷ', 'ⅸ' => 'Ⅸ', 'ⅹ' => 'Ⅹ', 'ⅺ' => 'Ⅺ', 'ⅻ' => 'Ⅻ', 'ⅼ' => 'Ⅼ', 'ⅽ' => 'Ⅽ', 'ⅾ' => 'Ⅾ', 'ⅿ' => 'Ⅿ', 'ↄ' => 'Ↄ', 'ⓐ' => 'Ⓐ', 'ⓑ' => 'Ⓑ', 'ⓒ' => 'Ⓒ', 'ⓓ' => 'Ⓓ', 'ⓔ' => 'Ⓔ', 'ⓕ' => 'Ⓕ', 'ⓖ' => 'Ⓖ', 'ⓗ' => 'Ⓗ', 'ⓘ' => 'Ⓘ', 'ⓙ' => 'Ⓙ', 'ⓚ' => 'Ⓚ', 'ⓛ' => 'Ⓛ', 'ⓜ' => 'Ⓜ', 'ⓝ' => 'Ⓝ', 'ⓞ' => 'Ⓞ', 'ⓟ' => 'Ⓟ', 'ⓠ' => 'Ⓠ', 'ⓡ' => 'Ⓡ', 'ⓢ' => 'Ⓢ', 'ⓣ' => 'Ⓣ', 'ⓤ' => 'Ⓤ', 'ⓥ' => 'Ⓥ', 'ⓦ' => 'Ⓦ', 'ⓧ' => 'Ⓧ', 'ⓨ' => 'Ⓨ', 'ⓩ' => 'Ⓩ', 'ⰰ' => 'Ⰰ', 'ⰱ' => 'Ⰱ', 'ⰲ' => 'Ⰲ', 'ⰳ' => 'Ⰳ', 'ⰴ' => 'Ⰴ', 'ⰵ' => 'Ⰵ', 'ⰶ' => 'Ⰶ', 'ⰷ' => 'Ⰷ', 'ⰸ' => 'Ⰸ', 'ⰹ' => 'Ⰹ', 'ⰺ' => 'Ⰺ', 'ⰻ' => 'Ⰻ', 'ⰼ' => 'Ⰼ', 'ⰽ' => 'Ⰽ', 'ⰾ' => 'Ⰾ', 'ⰿ' => 'Ⰿ', 'ⱀ' => 'Ⱀ', 'ⱁ' => 'Ⱁ', 'ⱂ' => 'Ⱂ', 'ⱃ' => 'Ⱃ', 'ⱄ' => 'Ⱄ', 'ⱅ' => 'Ⱅ', 'ⱆ' => 'Ⱆ', 'ⱇ' => 'Ⱇ', 'ⱈ' => 'Ⱈ', 'ⱉ' => 'Ⱉ', 'ⱊ' => 'Ⱊ', 'ⱋ' => 'Ⱋ', 'ⱌ' => 'Ⱌ', 'ⱍ' => 'Ⱍ', 'ⱎ' => 'Ⱎ', 'ⱏ' => 'Ⱏ', 'ⱐ' => 'Ⱐ', 'ⱑ' => 'Ⱑ', 'ⱒ' => 'Ⱒ', 'ⱓ' => 'Ⱓ', 'ⱔ' => 'Ⱔ', 'ⱕ' => 'Ⱕ', 'ⱖ' => 'Ⱖ', 'ⱗ' => 'Ⱗ', 'ⱘ' => 'Ⱘ', 'ⱙ' => 'Ⱙ', 'ⱚ' => 'Ⱚ', 'ⱛ' => 'Ⱛ', 'ⱜ' => 'Ⱜ', 'ⱝ' => 'Ⱝ', 'ⱞ' => 'Ⱞ', 'ⱡ' => 'Ⱡ', 'ⱥ' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'ⱳ' => 'Ⱳ', 'ⱶ' => 'Ⱶ', 'ⲁ' => 'Ⲁ', 'ⲃ' => 'Ⲃ', 'ⲅ' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'ⲍ' => 'Ⲍ', 'ⲏ' => 'Ⲏ', 'ⲑ' => 'Ⲑ', 'ⲓ' => 'Ⲓ', 'ⲕ' => 'Ⲕ', 'ⲗ' => 'Ⲗ', 'ⲙ' => 'Ⲙ', 'ⲛ' => 'Ⲛ', 'ⲝ' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'Ⲡ', 'ⲣ' => 'Ⲣ', 'ⲥ' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'ⲭ' => 'Ⲭ', 'ⲯ' => 'Ⲯ', 'ⲱ' => 'Ⲱ', 'ⲳ' => 'Ⲳ', 'ⲵ' => 'Ⲵ', 'ⲷ' => 'Ⲷ', 'ⲹ' => 'Ⲹ', 'ⲻ' => 'Ⲻ', 'ⲽ' => 'Ⲽ', 'ⲿ' => 'Ⲿ', 'ⳁ' => 'Ⳁ', 'ⳃ' => 'Ⳃ', 'ⳅ' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'ⳍ' => 'Ⳍ', 'ⳏ' => 'Ⳏ', 'ⳑ' => 'Ⳑ', 'ⳓ' => 'Ⳓ', 'ⳕ' => 'Ⳕ', 'ⳗ' => 'Ⳗ', 'ⳙ' => 'Ⳙ', 'ⳛ' => 'Ⳛ', 'ⳝ' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'Ⳡ', 'ⳣ' => 'Ⳣ', 'ⳬ' => 'Ⳬ', 'ⳮ' => 'Ⳮ', 'ⳳ' => 'Ⳳ', 'ⴀ' => 'Ⴀ', 'ⴁ' => 'Ⴁ', 'ⴂ' => 'Ⴂ', 'ⴃ' => 'Ⴃ', 'ⴄ' => 'Ⴄ', 'ⴅ' => 'Ⴅ', 'ⴆ' => 'Ⴆ', 'ⴇ' => 'Ⴇ', 'ⴈ' => 'Ⴈ', 'ⴉ' => 'Ⴉ', 'ⴊ' => 'Ⴊ', 'ⴋ' => 'Ⴋ', 'ⴌ' => 'Ⴌ', 'ⴍ' => 'Ⴍ', 'ⴎ' => 'Ⴎ', 'ⴏ' => 'Ⴏ', 'ⴐ' => 'Ⴐ', 'ⴑ' => 'Ⴑ', 'ⴒ' => 'Ⴒ', 'ⴓ' => 'Ⴓ', 'ⴔ' => 'Ⴔ', 'ⴕ' => 'Ⴕ', 'ⴖ' => 'Ⴖ', 'ⴗ' => 'Ⴗ', 'ⴘ' => 'Ⴘ', 'ⴙ' => 'Ⴙ', 'ⴚ' => 'Ⴚ', 'ⴛ' => 'Ⴛ', 'ⴜ' => 'Ⴜ', 'ⴝ' => 'Ⴝ', 'ⴞ' => 'Ⴞ', 'ⴟ' => 'Ⴟ', 'ⴠ' => 'Ⴠ', 'ⴡ' => 'Ⴡ', 'ⴢ' => 'Ⴢ', 'ⴣ' => 'Ⴣ', 'ⴤ' => 'Ⴤ', 'ⴥ' => 'Ⴥ', 'ⴧ' => 'Ⴧ', 'ⴭ' => 'Ⴭ', 'ꙁ' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ꙅ' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ꙍ' => 'Ꙍ', 'ꙏ' => 'Ꙏ', 'ꙑ' => 'Ꙑ', 'ꙓ' => 'Ꙓ', 'ꙕ' => 'Ꙕ', 'ꙗ' => 'Ꙗ', 'ꙙ' => 'Ꙙ', 'ꙛ' => 'Ꙛ', 'ꙝ' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'Ꙡ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ꙭ' => 'Ꙭ', 'ꚁ' => 'Ꚁ', 'ꚃ' => 'Ꚃ', 'ꚅ' => 'Ꚅ', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'ꚋ' => 'Ꚋ', 'ꚍ' => 'Ꚍ', 'ꚏ' => 'Ꚏ', 'ꚑ' => 'Ꚑ', 'ꚓ' => 'Ꚓ', 'ꚕ' => 'Ꚕ', 'ꚗ' => 'Ꚗ', 'ꚙ' => 'Ꚙ', 'ꚛ' => 'Ꚛ', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ꝁ' => 'Ꝁ', 'ꝃ' => 'Ꝃ', 'ꝅ' => 'Ꝅ', 'ꝇ' => 'Ꝇ', 'ꝉ' => 'Ꝉ', 'ꝋ' => 'Ꝋ', 'ꝍ' => 'Ꝍ', 'ꝏ' => 'Ꝏ', 'ꝑ' => 'Ꝑ', 'ꝓ' => 'Ꝓ', 'ꝕ' => 'Ꝕ', 'ꝗ' => 'Ꝗ', 'ꝙ' => 'Ꝙ', 'ꝛ' => 'Ꝛ', 'ꝝ' => 'Ꝝ', 'ꝟ' => 'Ꝟ', 'ꝡ' => 'Ꝡ', 'ꝣ' => 'Ꝣ', 'ꝥ' => 'Ꝥ', 'ꝧ' => 'Ꝧ', 'ꝩ' => 'Ꝩ', 'ꝫ' => 'Ꝫ', 'ꝭ' => 'Ꝭ', 'ꝯ' => 'Ꝯ', 'ꝺ' => 'Ꝺ', 'ꝼ' => 'Ꝼ', 'ꝿ' => 'Ꝿ', 'ꞁ' => 'Ꞁ', 'ꞃ' => 'Ꞃ', 'ꞅ' => 'Ꞅ', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'Ꞌ', 'ꞑ' => 'Ꞑ', 'ꞓ' => 'Ꞓ', 'ꞔ' => 'Ꞔ', 'ꞗ' => 'Ꞗ', 'ꞙ' => 'Ꞙ', 'ꞛ' => 'Ꞛ', 'ꞝ' => 'Ꞝ', 'ꞟ' => 'Ꞟ', 'ꞡ' => 'Ꞡ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'ꞩ' => 'Ꞩ', 'ꞵ' => 'Ꞵ', 'ꞷ' => 'Ꞷ', 'ꞹ' => 'Ꞹ', 'ꞻ' => 'Ꞻ', 'ꞽ' => 'Ꞽ', 'ꞿ' => 'Ꞿ', 'ꟃ' => 'Ꟃ', 'ꟈ' => 'Ꟈ', 'ꟊ' => 'Ꟊ', 'ꟶ' => 'Ꟶ', 'ꭓ' => 'Ꭓ', 'ꭰ' => 'Ꭰ', 'ꭱ' => 'Ꭱ', 'ꭲ' => 'Ꭲ', 'ꭳ' => 'Ꭳ', 'ꭴ' => 'Ꭴ', 'ꭵ' => 'Ꭵ', 'ꭶ' => 'Ꭶ', 'ꭷ' => 'Ꭷ', 'ꭸ' => 'Ꭸ', 'ꭹ' => 'Ꭹ', 'ꭺ' => 'Ꭺ', 'ꭻ' => 'Ꭻ', 'ꭼ' => 'Ꭼ', 'ꭽ' => 'Ꭽ', 'ꭾ' => 'Ꭾ', 'ꭿ' => 'Ꭿ', 'ꮀ' => 'Ꮀ', 'ꮁ' => 'Ꮁ', 'ꮂ' => 'Ꮂ', 'ꮃ' => 'Ꮃ', 'ꮄ' => 'Ꮄ', 'ꮅ' => 'Ꮅ', 'ꮆ' => 'Ꮆ', 'ꮇ' => 'Ꮇ', 'ꮈ' => 'Ꮈ', 'ꮉ' => 'Ꮉ', 'ꮊ' => 'Ꮊ', 'ꮋ' => 'Ꮋ', 'ꮌ' => 'Ꮌ', 'ꮍ' => 'Ꮍ', 'ꮎ' => 'Ꮎ', 'ꮏ' => 'Ꮏ', 'ꮐ' => 'Ꮐ', 'ꮑ' => 'Ꮑ', 'ꮒ' => 'Ꮒ', 'ꮓ' => 'Ꮓ', 'ꮔ' => 'Ꮔ', 'ꮕ' => 'Ꮕ', 'ꮖ' => 'Ꮖ', 'ꮗ' => 'Ꮗ', 'ꮘ' => 'Ꮘ', 'ꮙ' => 'Ꮙ', 'ꮚ' => 'Ꮚ', 'ꮛ' => 'Ꮛ', 'ꮜ' => 'Ꮜ', 'ꮝ' => 'Ꮝ', 'ꮞ' => 'Ꮞ', 'ꮟ' => 'Ꮟ', 'ꮠ' => 'Ꮠ', 'ꮡ' => 'Ꮡ', 'ꮢ' => 'Ꮢ', 'ꮣ' => 'Ꮣ', 'ꮤ' => 'Ꮤ', 'ꮥ' => 'Ꮥ', 'ꮦ' => 'Ꮦ', 'ꮧ' => 'Ꮧ', 'ꮨ' => 'Ꮨ', 'ꮩ' => 'Ꮩ', 'ꮪ' => 'Ꮪ', 'ꮫ' => 'Ꮫ', 'ꮬ' => 'Ꮬ', 'ꮭ' => 'Ꮭ', 'ꮮ' => 'Ꮮ', 'ꮯ' => 'Ꮯ', 'ꮰ' => 'Ꮰ', 'ꮱ' => 'Ꮱ', 'ꮲ' => 'Ꮲ', 'ꮳ' => 'Ꮳ', 'ꮴ' => 'Ꮴ', 'ꮵ' => 'Ꮵ', 'ꮶ' => 'Ꮶ', 'ꮷ' => 'Ꮷ', 'ꮸ' => 'Ꮸ', 'ꮹ' => 'Ꮹ', 'ꮺ' => 'Ꮺ', 'ꮻ' => 'Ꮻ', 'ꮼ' => 'Ꮼ', 'ꮽ' => 'Ꮽ', 'ꮾ' => 'Ꮾ', 'ꮿ' => 'Ꮿ', 'a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', '𐐨' => '𐐀', '𐐩' => '𐐁', '𐐪' => '𐐂', '𐐫' => '𐐃', '𐐬' => '𐐄', '𐐭' => '𐐅', '𐐮' => '𐐆', '𐐯' => '𐐇', '𐐰' => '𐐈', '𐐱' => '𐐉', '𐐲' => '𐐊', '𐐳' => '𐐋', '𐐴' => '𐐌', '𐐵' => '𐐍', '𐐶' => '𐐎', '𐐷' => '𐐏', '𐐸' => '𐐐', '𐐹' => '𐐑', '𐐺' => '𐐒', '𐐻' => '𐐓', '𐐼' => '𐐔', '𐐽' => '𐐕', '𐐾' => '𐐖', '𐐿' => '𐐗', '𐑀' => '𐐘', '𐑁' => '𐐙', '𐑂' => '𐐚', '𐑃' => '𐐛', '𐑄' => '𐐜', '𐑅' => '𐐝', '𐑆' => '𐐞', '𐑇' => '𐐟', '𐑈' => '𐐠', '𐑉' => '𐐡', '𐑊' => '𐐢', '𐑋' => '𐐣', '𐑌' => '𐐤', '𐑍' => '𐐥', '𐑎' => '𐐦', '𐑏' => '𐐧', '𐓘' => '𐒰', '𐓙' => '𐒱', '𐓚' => '𐒲', '𐓛' => '𐒳', '𐓜' => '𐒴', '𐓝' => '𐒵', '𐓞' => '𐒶', '𐓟' => '𐒷', '𐓠' => '𐒸', '𐓡' => '𐒹', '𐓢' => '𐒺', '𐓣' => '𐒻', '𐓤' => '𐒼', '𐓥' => '𐒽', '𐓦' => '𐒾', '𐓧' => '𐒿', '𐓨' => '𐓀', '𐓩' => '𐓁', '𐓪' => '𐓂', '𐓫' => '𐓃', '𐓬' => '𐓄', '𐓭' => '𐓅', '𐓮' => '𐓆', '𐓯' => '𐓇', '𐓰' => '𐓈', '𐓱' => '𐓉', '𐓲' => '𐓊', '𐓳' => '𐓋', '𐓴' => '𐓌', '𐓵' => '𐓍', '𐓶' => '𐓎', '𐓷' => '𐓏', '𐓸' => '𐓐', '𐓹' => '𐓑', '𐓺' => '𐓒', '𐓻' => '𐓓', '𐳀' => '𐲀', '𐳁' => '𐲁', '𐳂' => '𐲂', '𐳃' => '𐲃', '𐳄' => '𐲄', '𐳅' => '𐲅', '𐳆' => '𐲆', '𐳇' => '𐲇', '𐳈' => '𐲈', '𐳉' => '𐲉', '𐳊' => '𐲊', '𐳋' => '𐲋', '𐳌' => '𐲌', '𐳍' => '𐲍', '𐳎' => '𐲎', '𐳏' => '𐲏', '𐳐' => '𐲐', '𐳑' => '𐲑', '𐳒' => '𐲒', '𐳓' => '𐲓', '𐳔' => '𐲔', '𐳕' => '𐲕', '𐳖' => '𐲖', '𐳗' => '𐲗', '𐳘' => '𐲘', '𐳙' => '𐲙', '𐳚' => '𐲚', '𐳛' => '𐲛', '𐳜' => '𐲜', '𐳝' => '𐲝', '𐳞' => '𐲞', '𐳟' => '𐲟', '𐳠' => '𐲠', '𐳡' => '𐲡', '𐳢' => '𐲢', '𐳣' => '𐲣', '𐳤' => '𐲤', '𐳥' => '𐲥', '𐳦' => '𐲦', '𐳧' => '𐲧', '𐳨' => '𐲨', '𐳩' => '𐲩', '𐳪' => '𐲪', '𐳫' => '𐲫', '𐳬' => '𐲬', '𐳭' => '𐲭', '𐳮' => '𐲮', '𐳯' => '𐲯', '𐳰' => '𐲰', '𐳱' => '𐲱', '𐳲' => '𐲲', '𑣀' => '𑢠', '𑣁' => '𑢡', '𑣂' => '𑢢', '𑣃' => '𑢣', '𑣄' => '𑢤', '𑣅' => '𑢥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', '𑣍' => '𑢭', '𑣎' => '𑢮', '𑣏' => '𑢯', '𑣐' => '𑢰', '𑣑' => '𑢱', '𑣒' => '𑢲', '𑣓' => '𑢳', '𑣔' => '𑢴', '𑣕' => '𑢵', '𑣖' => '𑢶', '𑣗' => '𑢷', '𑣘' => '𑢸', '𑣙' => '𑢹', '𑣚' => '𑢺', '𑣛' => '𑢻', '𑣜' => '𑢼', '𑣝' => '𑢽', '𑣞' => '𑢾', '𑣟' => '𑢿', '𖹠' => '𖹀', '𖹡' => '𖹁', '𖹢' => '𖹂', '𖹣' => '𖹃', '𖹤' => '𖹄', '𖹥' => '𖹅', '𖹦' => '𖹆', '𖹧' => '𖹇', '𖹨' => '𖹈', '𖹩' => '𖹉', '𖹪' => '𖹊', '𖹫' => '𖹋', '𖹬' => '𖹌', '𖹭' => '𖹍', '𖹮' => '𖹎', '𖹯' => '𖹏', '𖹰' => '𖹐', '𖹱' => '𖹑', '𖹲' => '𖹒', '𖹳' => '𖹓', '𖹴' => '𖹔', '𖹵' => '𖹕', '𖹶' => '𖹖', '𖹷' => '𖹗', '𖹸' => '𖹘', '𖹹' => '𖹙', '𖹺' => '𖹚', '𖹻' => '𖹛', '𖹼' => '𖹜', '𖹽' => '𖹝', '𖹾' => '𖹞', '𖹿' => '𖹟', '𞤢' => '𞤀', '𞤣' => '𞤁', '𞤤' => '𞤂', '𞤥' => '𞤃', '𞤦' => '𞤄', '𞤧' => '𞤅', '𞤨' => '𞤆', '𞤩' => '𞤇', '𞤪' => '𞤈', '𞤫' => '𞤉', '𞤬' => '𞤊', '𞤭' => '𞤋', '𞤮' => '𞤌', '𞤯' => '𞤍', '𞤰' => '𞤎', '𞤱' => '𞤏', '𞤲' => '𞤐', '𞤳' => '𞤑', '𞤴' => '𞤒', '𞤵' => '𞤓', '𞤶' => '𞤔', '𞤷' => '𞤕', '𞤸' => '𞤖', '𞤹' => '𞤗', '𞤺' => '𞤘', '𞤻' => '𞤙', '𞤼' => '𞤚', '𞤽' => '𞤛', '𞤾' => '𞤜', '𞤿' => '𞤝', '𞥀' => '𞤞', '𞥁' => '𞤟', '𞥂' => '𞤠', '𞥃' => '𞤡', 'ß' => 'SS', 'ff' => 'FF', 'fi' => 'FI', 'fl' => 'FL', 'ffi' => 'FFI', 'ffl' => 'FFL', 'ſt' => 'ST', 'st' => 'ST', 'և' => 'ԵՒ', 'ﬓ' => 'ՄՆ', 'ﬔ' => 'ՄԵ', 'ﬕ' => 'ՄԻ', 'ﬖ' => 'ՎՆ', 'ﬗ' => 'ՄԽ', 'ʼn' => 'ʼN', 'ΐ' => 'Ϊ́', 'ΰ' => 'Ϋ́', 'ǰ' => 'J̌', 'ẖ' => 'H̱', 'ẗ' => 'T̈', 'ẘ' => 'W̊', 'ẙ' => 'Y̊', 'ẚ' => 'Aʾ', 'ὐ' => 'Υ̓', 'ὒ' => 'Υ̓̀', 'ὔ' => 'Υ̓́', 'ὖ' => 'Υ̓͂', 'ᾶ' => 'Α͂', 'ῆ' => 'Η͂', 'ῒ' => 'Ϊ̀', 'ΐ' => 'Ϊ́', 'ῖ' => 'Ι͂', 'ῗ' => 'Ϊ͂', 'ῢ' => 'Ϋ̀', 'ΰ' => 'Ϋ́', 'ῤ' => 'Ρ̓', 'ῦ' => 'Υ͂', 'ῧ' => 'Ϋ͂', 'ῶ' => 'Ω͂', 'ᾈ' => 'ἈΙ', 'ᾉ' => 'ἉΙ', 'ᾊ' => 'ἊΙ', 'ᾋ' => 'ἋΙ', 'ᾌ' => 'ἌΙ', 'ᾍ' => 'ἍΙ', 'ᾎ' => 'ἎΙ', 'ᾏ' => 'ἏΙ', 'ᾘ' => 'ἨΙ', 'ᾙ' => 'ἩΙ', 'ᾚ' => 'ἪΙ', 'ᾛ' => 'ἫΙ', 'ᾜ' => 'ἬΙ', 'ᾝ' => 'ἭΙ', 'ᾞ' => 'ἮΙ', 'ᾟ' => 'ἯΙ', 'ᾨ' => 'ὨΙ', 'ᾩ' => 'ὩΙ', 'ᾪ' => 'ὪΙ', 'ᾫ' => 'ὫΙ', 'ᾬ' => 'ὬΙ', 'ᾭ' => 'ὭΙ', 'ᾮ' => 'ὮΙ', 'ᾯ' => 'ὯΙ', 'ᾼ' => 'ΑΙ', 'ῌ' => 'ΗΙ', 'ῼ' => 'ΩΙ', 'ᾲ' => 'ᾺΙ', 'ᾴ' => 'ΆΙ', 'ῂ' => 'ῊΙ', 'ῄ' => 'ΉΙ', 'ῲ' => 'ῺΙ', 'ῴ' => 'ΏΙ', 'ᾷ' => 'Α͂Ι', 'ῇ' => 'Η͂Ι', 'ῷ' => 'Ω͂Ι'); diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php new file mode 100644 index 00000000..e46d4e90 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/bootstrap.php @@ -0,0 +1,264 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use Symfony\Polyfill\Mbstring as p; +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__ . '/bootstrap80.php'; +} +if (!\function_exists('mb_convert_encoding')) { + function mb_convert_encoding($string, $to_encoding, $from_encoding = null) + { + return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); + } +} +if (!\function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader($string) + { + return p\Mbstring::mb_decode_mimeheader($string); + } +} +if (!\function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = "\r\n", $indent = 0) + { + return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); + } +} +if (!\function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity($string, $map, $encoding = null) + { + return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); + } +} +if (!\function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity($string, $map, $encoding = null, $hex = \false) + { + return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); + } +} +if (!\function_exists('mb_convert_case')) { + function mb_convert_case($string, $mode, $encoding = null) + { + return p\Mbstring::mb_convert_case($string, $mode, $encoding); + } +} +if (!\function_exists('mb_internal_encoding')) { + function mb_internal_encoding($encoding = null) + { + return p\Mbstring::mb_internal_encoding($encoding); + } +} +if (!\function_exists('mb_language')) { + function mb_language($language = null) + { + return p\Mbstring::mb_language($language); + } +} +if (!\function_exists('mb_list_encodings')) { + function mb_list_encodings() + { + return p\Mbstring::mb_list_encodings(); + } +} +if (!\function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases($encoding) + { + return p\Mbstring::mb_encoding_aliases($encoding); + } +} +if (!\function_exists('mb_check_encoding')) { + function mb_check_encoding($value = null, $encoding = null) + { + return p\Mbstring::mb_check_encoding($value, $encoding); + } +} +if (!\function_exists('mb_detect_encoding')) { + function mb_detect_encoding($string, $encodings = null, $strict = \false) + { + return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); + } +} +if (!\function_exists('mb_detect_order')) { + function mb_detect_order($encoding = null) + { + return p\Mbstring::mb_detect_order($encoding); + } +} +if (!\function_exists('mb_parse_str')) { + function mb_parse_str($string, &$result = []) + { + \parse_str($string, $result); + return (bool) $result; + } +} +if (!\function_exists('mb_strlen')) { + function mb_strlen($string, $encoding = null) + { + return p\Mbstring::mb_strlen($string, $encoding); + } +} +if (!\function_exists('mb_strpos')) { + function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) + { + return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); + } +} +if (!\function_exists('mb_strtolower')) { + function mb_strtolower($string, $encoding = null) + { + return p\Mbstring::mb_strtolower($string, $encoding); + } +} +if (!\function_exists('mb_strtoupper')) { + function mb_strtoupper($string, $encoding = null) + { + return p\Mbstring::mb_strtoupper($string, $encoding); + } +} +if (!\function_exists('mb_substitute_character')) { + function mb_substitute_character($substitute_character = null) + { + return p\Mbstring::mb_substitute_character($substitute_character); + } +} +if (!\function_exists('mb_substr')) { + function mb_substr($string, $start, $length = 2147483647, $encoding = null) + { + return p\Mbstring::mb_substr($string, $start, $length, $encoding); + } +} +if (!\function_exists('mb_stripos')) { + function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) + { + return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); + } +} +if (!\function_exists('mb_stristr')) { + function mb_stristr($haystack, $needle, $before_needle = \false, $encoding = null) + { + return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); + } +} +if (!\function_exists('mb_strrchr')) { + function mb_strrchr($haystack, $needle, $before_needle = \false, $encoding = null) + { + return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); + } +} +if (!\function_exists('mb_strrichr')) { + function mb_strrichr($haystack, $needle, $before_needle = \false, $encoding = null) + { + return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); + } +} +if (!\function_exists('mb_strripos')) { + function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) + { + return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); + } +} +if (!\function_exists('mb_strrpos')) { + function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) + { + return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); + } +} +if (!\function_exists('mb_strstr')) { + function mb_strstr($haystack, $needle, $before_needle = \false, $encoding = null) + { + return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); + } +} +if (!\function_exists('mb_get_info')) { + function mb_get_info($type = 'all') + { + return p\Mbstring::mb_get_info($type); + } +} +if (!\function_exists('mb_http_output')) { + function mb_http_output($encoding = null) + { + return p\Mbstring::mb_http_output($encoding); + } +} +if (!\function_exists('mb_strwidth')) { + function mb_strwidth($string, $encoding = null) + { + return p\Mbstring::mb_strwidth($string, $encoding); + } +} +if (!\function_exists('mb_substr_count')) { + function mb_substr_count($haystack, $needle, $encoding = null) + { + return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); + } +} +if (!\function_exists('mb_output_handler')) { + function mb_output_handler($string, $status) + { + return p\Mbstring::mb_output_handler($string, $status); + } +} +if (!\function_exists('mb_http_input')) { + function mb_http_input($type = null) + { + return p\Mbstring::mb_http_input($type); + } +} +if (!\function_exists('mb_convert_variables')) { + function mb_convert_variables($to_encoding, $from_encoding, &...$vars) + { + return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); + } +} +if (!\function_exists('mb_ord')) { + function mb_ord($string, $encoding = null) + { + return p\Mbstring::mb_ord($string, $encoding); + } +} +if (!\function_exists('mb_chr')) { + function mb_chr($codepoint, $encoding = null) + { + return p\Mbstring::mb_chr($codepoint, $encoding); + } +} +if (!\function_exists('mb_scrub')) { + function mb_scrub($string, $encoding = null) + { + $encoding = null === $encoding ? \mb_internal_encoding() : $encoding; + return \mb_convert_encoding($string, $encoding, $encoding); + } +} +if (!\function_exists('mb_str_split')) { + function mb_str_split($string, $length = 1, $encoding = null) + { + return p\Mbstring::mb_str_split($string, $length, $encoding); + } +} +if (!\function_exists('RuleDocGenerator202403\\mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null) : string + { + return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); + } +} +if (\extension_loaded('mbstring')) { + return; +} +if (!\defined('MB_CASE_UPPER')) { + \define('MB_CASE_UPPER', 0); +} +if (!\defined('MB_CASE_LOWER')) { + \define('MB_CASE_LOWER', 1); +} +if (!\defined('MB_CASE_TITLE')) { + \define('MB_CASE_TITLE', 2); +} diff --git a/vendor/symfony/polyfill-mbstring/bootstrap80.php b/vendor/symfony/polyfill-mbstring/bootstrap80.php new file mode 100644 index 00000000..68f96371 --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/bootstrap80.php @@ -0,0 +1,332 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use Symfony\Polyfill\Mbstring as p; +if (!\function_exists('mb_convert_encoding')) { + /** + * @param mixed[]|string|null $string + * @param mixed[]|string|null $from_encoding + * @return mixed[]|string|false + */ + function mb_convert_encoding($string, ?string $to_encoding, $from_encoding = null) + { + return p\Mbstring::mb_convert_encoding($string ?? '', (string) $to_encoding, $from_encoding); + } +} +if (!\function_exists('mb_decode_mimeheader')) { + function mb_decode_mimeheader(?string $string) : string + { + return p\Mbstring::mb_decode_mimeheader((string) $string); + } +} +if (!\function_exists('mb_encode_mimeheader')) { + function mb_encode_mimeheader(?string $string, ?string $charset = null, ?string $transfer_encoding = null, ?string $newline = "\r\n", ?int $indent = 0) : string + { + return p\Mbstring::mb_encode_mimeheader((string) $string, $charset, $transfer_encoding, (string) $newline, (int) $indent); + } +} +if (!\function_exists('mb_decode_numericentity')) { + function mb_decode_numericentity(?string $string, array $map, ?string $encoding = null) : string + { + return p\Mbstring::mb_decode_numericentity((string) $string, $map, $encoding); + } +} +if (!\function_exists('mb_encode_numericentity')) { + function mb_encode_numericentity(?string $string, array $map, ?string $encoding = null, ?bool $hex = \false) : string + { + return p\Mbstring::mb_encode_numericentity((string) $string, $map, $encoding, (bool) $hex); + } +} +if (!\function_exists('mb_convert_case')) { + function mb_convert_case(?string $string, ?int $mode, ?string $encoding = null) : string + { + return p\Mbstring::mb_convert_case((string) $string, (int) $mode, $encoding); + } +} +if (!\function_exists('mb_internal_encoding')) { + /** + * @return string|bool + */ + function mb_internal_encoding(?string $encoding = null) + { + return p\Mbstring::mb_internal_encoding($encoding); + } +} +if (!\function_exists('mb_language')) { + /** + * @return string|bool + */ + function mb_language(?string $language = null) + { + return p\Mbstring::mb_language($language); + } +} +if (!\function_exists('mb_list_encodings')) { + function mb_list_encodings() : array + { + return p\Mbstring::mb_list_encodings(); + } +} +if (!\function_exists('mb_encoding_aliases')) { + function mb_encoding_aliases(?string $encoding) : array + { + return p\Mbstring::mb_encoding_aliases((string) $encoding); + } +} +if (!\function_exists('mb_check_encoding')) { + /** + * @param mixed[]|string|null $value + */ + function mb_check_encoding($value = null, ?string $encoding = null) : bool + { + return p\Mbstring::mb_check_encoding($value, $encoding); + } +} +if (!\function_exists('mb_detect_encoding')) { + /** + * @param mixed[]|string|null $encodings + * @return string|false + */ + function mb_detect_encoding(?string $string, $encodings = null, ?bool $strict = \false) + { + return p\Mbstring::mb_detect_encoding((string) $string, $encodings, (bool) $strict); + } +} +if (!\function_exists('mb_detect_order')) { + /** + * @param mixed[]|string|null $encoding + * @return mixed[]|bool + */ + function mb_detect_order($encoding = null) + { + return p\Mbstring::mb_detect_order($encoding); + } +} +if (!\function_exists('mb_parse_str')) { + function mb_parse_str(?string $string, &$result = []) : bool + { + \parse_str((string) $string, $result); + return (bool) $result; + } +} +if (!\function_exists('mb_strlen')) { + function mb_strlen(?string $string, ?string $encoding = null) : int + { + return p\Mbstring::mb_strlen((string) $string, $encoding); + } +} +if (!\function_exists('mb_strpos')) { + /** + * @return int|false + */ + function mb_strpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) + { + return p\Mbstring::mb_strpos((string) $haystack, (string) $needle, (int) $offset, $encoding); + } +} +if (!\function_exists('mb_strtolower')) { + function mb_strtolower(?string $string, ?string $encoding = null) : string + { + return p\Mbstring::mb_strtolower((string) $string, $encoding); + } +} +if (!\function_exists('mb_strtoupper')) { + function mb_strtoupper(?string $string, ?string $encoding = null) : string + { + return p\Mbstring::mb_strtoupper((string) $string, $encoding); + } +} +if (!\function_exists('mb_substitute_character')) { + /** + * @param string|int|null $substitute_character + * @return string|int|bool + */ + function mb_substitute_character($substitute_character = null) + { + return p\Mbstring::mb_substitute_character($substitute_character); + } +} +if (!\function_exists('mb_substr')) { + function mb_substr(?string $string, ?int $start, ?int $length = null, ?string $encoding = null) : string + { + return p\Mbstring::mb_substr((string) $string, (int) $start, $length, $encoding); + } +} +if (!\function_exists('mb_stripos')) { + /** + * @return int|false + */ + function mb_stripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) + { + return p\Mbstring::mb_stripos((string) $haystack, (string) $needle, (int) $offset, $encoding); + } +} +if (!\function_exists('mb_stristr')) { + /** + * @return string|false + */ + function mb_stristr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) + { + return p\Mbstring::mb_stristr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); + } +} +if (!\function_exists('mb_strrchr')) { + /** + * @return string|false + */ + function mb_strrchr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) + { + return p\Mbstring::mb_strrchr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); + } +} +if (!\function_exists('mb_strrichr')) { + /** + * @return string|false + */ + function mb_strrichr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) + { + return p\Mbstring::mb_strrichr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); + } +} +if (!\function_exists('mb_strripos')) { + /** + * @return int|false + */ + function mb_strripos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) + { + return p\Mbstring::mb_strripos((string) $haystack, (string) $needle, (int) $offset, $encoding); + } +} +if (!\function_exists('mb_strrpos')) { + /** + * @return int|false + */ + function mb_strrpos(?string $haystack, ?string $needle, ?int $offset = 0, ?string $encoding = null) + { + return p\Mbstring::mb_strrpos((string) $haystack, (string) $needle, (int) $offset, $encoding); + } +} +if (!\function_exists('mb_strstr')) { + /** + * @return string|false + */ + function mb_strstr(?string $haystack, ?string $needle, ?bool $before_needle = \false, ?string $encoding = null) + { + return p\Mbstring::mb_strstr((string) $haystack, (string) $needle, (bool) $before_needle, $encoding); + } +} +if (!\function_exists('mb_get_info')) { + /** + * @return mixed[]|string|int|false + */ + function mb_get_info(?string $type = 'all') + { + return p\Mbstring::mb_get_info((string) $type); + } +} +if (!\function_exists('mb_http_output')) { + /** + * @return string|bool + */ + function mb_http_output(?string $encoding = null) + { + return p\Mbstring::mb_http_output($encoding); + } +} +if (!\function_exists('mb_strwidth')) { + function mb_strwidth(?string $string, ?string $encoding = null) : int + { + return p\Mbstring::mb_strwidth((string) $string, $encoding); + } +} +if (!\function_exists('mb_substr_count')) { + function mb_substr_count(?string $haystack, ?string $needle, ?string $encoding = null) : int + { + return p\Mbstring::mb_substr_count((string) $haystack, (string) $needle, $encoding); + } +} +if (!\function_exists('mb_output_handler')) { + function mb_output_handler(?string $string, ?int $status) : string + { + return p\Mbstring::mb_output_handler((string) $string, (int) $status); + } +} +if (!\function_exists('mb_http_input')) { + /** + * @return mixed[]|string|false + */ + function mb_http_input(?string $type = null) + { + return p\Mbstring::mb_http_input($type); + } +} +if (!\function_exists('mb_convert_variables')) { + /** + * @param mixed[]|string|null $from_encoding + * @return string|false + * @param mixed $var + * @param mixed ...$vars + */ + function mb_convert_variables(?string $to_encoding, $from_encoding, &$var, &...$vars) + { + return p\Mbstring::mb_convert_variables((string) $to_encoding, $from_encoding ?? '', $var, ...$vars); + } +} +if (!\function_exists('mb_ord')) { + /** + * @return int|false + */ + function mb_ord(?string $string, ?string $encoding = null) + { + return p\Mbstring::mb_ord((string) $string, $encoding); + } +} +if (!\function_exists('mb_chr')) { + /** + * @return string|false + */ + function mb_chr(?int $codepoint, ?string $encoding = null) + { + return p\Mbstring::mb_chr((int) $codepoint, $encoding); + } +} +if (!\function_exists('mb_scrub')) { + function mb_scrub(?string $string, ?string $encoding = null) : string + { + $encoding = $encoding ?? \mb_internal_encoding(); + return \mb_convert_encoding((string) $string, $encoding, $encoding); + } +} +if (!\function_exists('mb_str_split')) { + function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null) : array + { + return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); + } +} +if (!\function_exists('RuleDocGenerator202403\\mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, ?string $encoding = null) : string + { + return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); + } +} +if (\extension_loaded('mbstring')) { + return; +} +if (!\defined('MB_CASE_UPPER')) { + \define('MB_CASE_UPPER', 0); +} +if (!\defined('MB_CASE_LOWER')) { + \define('MB_CASE_LOWER', 1); +} +if (!\defined('MB_CASE_TITLE')) { + \define('MB_CASE_TITLE', 2); +} diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json new file mode 100644 index 00000000..e5067e8a --- /dev/null +++ b/vendor/symfony/polyfill-mbstring/composer.json @@ -0,0 +1,48 @@ +{ + "name": "symfony\/polyfill-mbstring", + "type": "library", + "description": "Symfony polyfill for the Mbstring extension", + "keywords": [ + "polyfill", + "shim", + "compatibility", + "portable", + "mbstring" + ], + "homepage": "https:\/\/symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "thanks": { + "name": "symfony\/polyfill", + "url": "https:\/\/github.com\/symfony\/polyfill" + } + } +} \ No newline at end of file diff --git a/vendor/symfony/service-contracts/Attribute/Required.php b/vendor/symfony/service-contracts/Attribute/Required.php new file mode 100644 index 00000000..f1ab8bdf --- /dev/null +++ b/vendor/symfony/service-contracts/Attribute/Required.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Contracts\Service\Attribute; + +/** + * A required dependency. + * + * This attribute indicates that a property holds a required dependency. The annotated property or method should be + * considered during the instantiation process of the containing class. + * + * @author Alexander M. Turek + */ +#[\Attribute(\Attribute::TARGET_METHOD | \Attribute::TARGET_PROPERTY)] +final class Required +{ +} diff --git a/vendor/symfony/service-contracts/Attribute/SubscribedService.php b/vendor/symfony/service-contracts/Attribute/SubscribedService.php new file mode 100644 index 00000000..24943905 --- /dev/null +++ b/vendor/symfony/service-contracts/Attribute/SubscribedService.php @@ -0,0 +1,55 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Contracts\Service\Attribute; + +use RuleDocGenerator202403\Symfony\Contracts\Service\ServiceSubscriberInterface; +use RuleDocGenerator202403\Symfony\Contracts\Service\ServiceSubscriberTrait; +/** + * For use as the return value for {@see ServiceSubscriberInterface}. + * + * @example new SubscribedService('http_client', HttpClientInterface::class, false, new Target('githubApi')) + * + * Use with {@see ServiceSubscriberTrait} to mark a method's return type + * as a subscribed service. + * + * @author Kevin Bond + */ +#[\Attribute(\Attribute::TARGET_METHOD)] +final class SubscribedService +{ + /** + * @var string|null + */ + public $key; + /** + * @var class-string|null + */ + public $type; + /** + * @var bool + */ + public $nullable = \false; + /** @var object[] */ + public $attributes; + /** + * @param string|null $key The key to use for the service + * @param class-string|null $type The service class + * @param bool $nullable Whether the service is optional + * @param object|object[] $attributes One or more dependency injection attributes to use + */ + public function __construct(?string $key = null, ?string $type = null, bool $nullable = \false, $attributes = []) + { + $this->key = $key; + $this->type = $type; + $this->nullable = $nullable; + $this->attributes = \is_array($attributes) ? $attributes : [$attributes]; + } +} diff --git a/vendor/symfony/service-contracts/CHANGELOG.md b/vendor/symfony/service-contracts/CHANGELOG.md new file mode 100644 index 00000000..7932e261 --- /dev/null +++ b/vendor/symfony/service-contracts/CHANGELOG.md @@ -0,0 +1,5 @@ +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/service-contracts/LICENSE b/vendor/symfony/service-contracts/LICENSE new file mode 100644 index 00000000..7536caea --- /dev/null +++ b/vendor/symfony/service-contracts/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-present Fabien Potencier + +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/symfony/service-contracts/README.md b/vendor/symfony/service-contracts/README.md new file mode 100644 index 00000000..42841a57 --- /dev/null +++ b/vendor/symfony/service-contracts/README.md @@ -0,0 +1,9 @@ +Symfony Service Contracts +========================= + +A set of abstractions extracted out of the Symfony components. + +Can be used to build on semantics that the Symfony components proved useful and +that already have battle tested implementations. + +See https://github.com/symfony/contracts/blob/main/README.md for more information. diff --git a/vendor/symfony/service-contracts/ResetInterface.php b/vendor/symfony/service-contracts/ResetInterface.php new file mode 100644 index 00000000..da40b9d0 --- /dev/null +++ b/vendor/symfony/service-contracts/ResetInterface.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Contracts\Service; + +/** + * Provides a way to reset an object to its initial state. + * + * When calling the "reset()" method on an object, it should be put back to its + * initial state. This usually means clearing any internal buffers and forwarding + * the call to internal dependencies. All properties of the object should be put + * back to the same state it had when it was first ready to use. + * + * This method could be called, for example, to recycle objects that are used as + * services, so that they can be used to handle several requests in the same + * process loop (note that we advise making your services stateless instead of + * implementing this interface when possible.) + */ +interface ResetInterface +{ + /** + * @return void + */ + public function reset(); +} diff --git a/vendor/symfony/service-contracts/ServiceLocatorTrait.php b/vendor/symfony/service-contracts/ServiceLocatorTrait.php new file mode 100644 index 00000000..d4ec44b8 --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceLocatorTrait.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Contracts\Service; + +use RuleDocGenerator202403\Psr\Container\ContainerExceptionInterface; +use RuleDocGenerator202403\Psr\Container\NotFoundExceptionInterface; +// Help opcache.preload discover always-needed symbols +\class_exists(ContainerExceptionInterface::class); +\class_exists(NotFoundExceptionInterface::class); +/** + * A trait to help implement ServiceProviderInterface. + * + * @author Robin Chalas + * @author Nicolas Grekas + */ +trait ServiceLocatorTrait +{ + /** + * @var mixed[] + */ + private $factories; + /** + * @var mixed[] + */ + private $loading = []; + /** + * @var mixed[] + */ + private $providedTypes; + /** + * @param array $factories + */ + public function __construct(array $factories) + { + $this->factories = $factories; + } + public function has(string $id) : bool + { + return isset($this->factories[$id]); + } + /** + * @return mixed + */ + public function get(string $id) + { + if (!isset($this->factories[$id])) { + throw $this->createNotFoundException($id); + } + if (isset($this->loading[$id])) { + $ids = \array_values($this->loading); + $ids = \array_slice($this->loading, \array_search($id, $ids)); + $ids[] = $id; + throw $this->createCircularReferenceException($id, $ids); + } + $this->loading[$id] = $id; + try { + return $this->factories[$id]($this); + } finally { + unset($this->loading[$id]); + } + } + public function getProvidedServices() : array + { + if (!isset($this->providedTypes)) { + $this->providedTypes = []; + foreach ($this->factories as $name => $factory) { + if (!\is_callable($factory)) { + $this->providedTypes[$name] = '?'; + } else { + $type = (new \ReflectionFunction($factory))->getReturnType(); + $this->providedTypes[$name] = $type ? ($type->allowsNull() ? '?' : '') . ($type instanceof \ReflectionNamedType ? $type->getName() : $type) : '?'; + } + } + } + return $this->providedTypes; + } + private function createNotFoundException(string $id) : NotFoundExceptionInterface + { + if (!($alternatives = \array_keys($this->factories))) { + $message = 'is empty...'; + } else { + $last = \array_pop($alternatives); + if ($alternatives) { + $message = \sprintf('only knows about the "%s" and "%s" services.', \implode('", "', $alternatives), $last); + } else { + $message = \sprintf('only knows about the "%s" service.', $last); + } + } + if ($this->loading) { + $message = \sprintf('The service "%s" has a dependency on a non-existent service "%s". This locator %s', \end($this->loading), $id, $message); + } else { + $message = \sprintf('Service "%s" not found: the current service locator %s', $id, $message); + } + return new class($message) extends \InvalidArgumentException implements NotFoundExceptionInterface + { + }; + } + private function createCircularReferenceException(string $id, array $path) : ContainerExceptionInterface + { + return new class(\sprintf('Circular reference detected for service "%s", path: "%s".', $id, \implode(' -> ', $path))) extends \RuntimeException implements ContainerExceptionInterface + { + }; + } +} diff --git a/vendor/symfony/service-contracts/ServiceProviderInterface.php b/vendor/symfony/service-contracts/ServiceProviderInterface.php new file mode 100644 index 00000000..5c54fc32 --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceProviderInterface.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Contracts\Service; + +use RuleDocGenerator202403\Psr\Container\ContainerInterface; +/** + * A ServiceProviderInterface exposes the identifiers and the types of services provided by a container. + * + * @author Nicolas Grekas + * @author Mateusz Sip + * + * @template-covariant T of mixed + */ +interface ServiceProviderInterface extends ContainerInterface +{ + /** + * @return T + */ + public function get(string $id); + public function has(string $id) : bool; + /** + * Returns an associative array of service types keyed by the identifiers provided by the current container. + * + * Examples: + * + * * ['logger' => 'Psr\Log\LoggerInterface'] means the object provides a service named "logger" that implements Psr\Log\LoggerInterface + * * ['foo' => '?'] means the container provides service name "foo" of unspecified type + * * ['bar' => '?Bar\Baz'] means the container provides a service "bar" of type Bar\Baz|null + * + * @return array The provided service types, keyed by service names + */ + public function getProvidedServices() : array; +} diff --git a/vendor/symfony/service-contracts/ServiceSubscriberInterface.php b/vendor/symfony/service-contracts/ServiceSubscriberInterface.php new file mode 100644 index 00000000..0974c723 --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceSubscriberInterface.php @@ -0,0 +1,60 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Contracts\Service; + +use RuleDocGenerator202403\Symfony\Contracts\Service\Attribute\SubscribedService; +/** + * A ServiceSubscriber exposes its dependencies via the static {@link getSubscribedServices} method. + * + * The getSubscribedServices method returns an array of service types required by such instances, + * optionally keyed by the service names used internally. Service types that start with an interrogation + * mark "?" are optional, while the other ones are mandatory service dependencies. + * + * The injected service locators SHOULD NOT allow access to any other services not specified by the method. + * + * It is expected that ServiceSubscriber instances consume PSR-11-based service locators internally. + * This interface does not dictate any injection method for these service locators, although constructor + * injection is recommended. + * + * @author Nicolas Grekas + */ +interface ServiceSubscriberInterface +{ + /** + * Returns an array of service types (or {@see SubscribedService} objects) required + * by such instances, optionally keyed by the service names used internally. + * + * For mandatory dependencies: + * + * * ['logger' => 'Psr\Log\LoggerInterface'] means the objects use the "logger" name + * internally to fetch a service which must implement Psr\Log\LoggerInterface. + * * ['loggers' => 'Psr\Log\LoggerInterface[]'] means the objects use the "loggers" name + * internally to fetch an iterable of Psr\Log\LoggerInterface instances. + * * ['Psr\Log\LoggerInterface'] is a shortcut for + * * ['Psr\Log\LoggerInterface' => 'Psr\Log\LoggerInterface'] + * + * otherwise: + * + * * ['logger' => '?Psr\Log\LoggerInterface'] denotes an optional dependency + * * ['loggers' => '?Psr\Log\LoggerInterface[]'] denotes an optional iterable dependency + * * ['?Psr\Log\LoggerInterface'] is a shortcut for + * * ['Psr\Log\LoggerInterface' => '?Psr\Log\LoggerInterface'] + * + * additionally, an array of {@see SubscribedService}'s can be returned: + * + * * [new SubscribedService('logger', Psr\Log\LoggerInterface::class)] + * * [new SubscribedService(type: Psr\Log\LoggerInterface::class, nullable: true)] + * * [new SubscribedService('http_client', HttpClientInterface::class, attributes: new Target('githubApi'))] + * + * @return string[]|SubscribedService[] The required service types, optionally keyed by service names + */ + public static function getSubscribedServices() : array; +} diff --git a/vendor/symfony/service-contracts/ServiceSubscriberTrait.php b/vendor/symfony/service-contracts/ServiceSubscriberTrait.php new file mode 100644 index 00000000..52e41651 --- /dev/null +++ b/vendor/symfony/service-contracts/ServiceSubscriberTrait.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Contracts\Service; + +use RuleDocGenerator202403\Psr\Container\ContainerInterface; +use RuleDocGenerator202403\Symfony\Contracts\Service\Attribute\Required; +use RuleDocGenerator202403\Symfony\Contracts\Service\Attribute\SubscribedService; +/** + * Implementation of ServiceSubscriberInterface that determines subscribed services from + * method return types. Service ids are available as "ClassName::methodName". + * + * @author Kevin Bond + */ +trait ServiceSubscriberTrait +{ + /** @var ContainerInterface */ + protected $container; + public static function getSubscribedServices() : array + { + $services = \method_exists(\get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; + foreach ((new \ReflectionClass(self::class))->getMethods() as $method) { + if (self::class !== $method->getDeclaringClass()->name) { + continue; + } + if (!($attribute = (\method_exists($method, 'getAttributes') ? $method->getAttributes(SubscribedService::class) : [])[0] ?? null)) { + continue; + } + if ($method->isStatic() || $method->isAbstract() || $method->isGenerator() || $method->isInternal() || $method->getNumberOfRequiredParameters()) { + throw new \LogicException(\sprintf('Cannot use "%s" on method "%s::%s()" (can only be used on non-static, non-abstract methods with no parameters).', SubscribedService::class, self::class, $method->name)); + } + if (!($returnType = $method->getReturnType())) { + throw new \LogicException(\sprintf('Cannot use "%s" on methods without a return type in "%s::%s()".', SubscribedService::class, $method->name, self::class)); + } + /* @var SubscribedService $attribute */ + $attribute = $attribute->newInstance(); + $attribute->key = $attribute->key ?? self::class . '::' . $method->name; + $attribute->type = $attribute->type ?? ($returnType instanceof \ReflectionNamedType ? $returnType->getName() : (string) $returnType); + $attribute->nullable = $returnType->allowsNull(); + if ($attribute->attributes) { + $services[] = $attribute; + } else { + $services[$attribute->key] = ($attribute->nullable ? '?' : '') . $attribute->type; + } + } + return $services; + } + /** + * @required + */ + public function setContainer(ContainerInterface $container) : ?ContainerInterface + { + $ret = null; + if (\method_exists(\get_parent_class(self::class) ?: '', __FUNCTION__)) { + $ret = parent::setContainer($container); + } + $this->container = $container; + return $ret; + } +} diff --git a/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php b/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php new file mode 100644 index 00000000..2cf27315 --- /dev/null +++ b/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Contracts\Service\Test; + +\class_alias(ServiceLocatorTestCase::class, ServiceLocatorTest::class); +if (\false) { + /** + * @deprecated since PHPUnit 9.6 + */ + class ServiceLocatorTest + { + } +} diff --git a/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php b/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php new file mode 100644 index 00000000..449bae05 --- /dev/null +++ b/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Contracts\Service\Test; + +use RuleDocGenerator202403\PHPUnit\Framework\TestCase; +use RuleDocGenerator202403\Psr\Container\ContainerExceptionInterface; +use RuleDocGenerator202403\Psr\Container\ContainerInterface; +use RuleDocGenerator202403\Psr\Container\NotFoundExceptionInterface; +use RuleDocGenerator202403\Symfony\Contracts\Service\ServiceLocatorTrait; +abstract class ServiceLocatorTestCase extends TestCase +{ + protected function getServiceLocator(array $factories) : ContainerInterface + { + return new class($factories) implements ContainerInterface + { + use ServiceLocatorTrait; + }; + } + public function testHas() + { + $locator = $this->getServiceLocator(['foo' => function () { + return 'bar'; + }, 'bar' => function () { + return 'baz'; + }, function () { + return 'dummy'; + }]); + $this->assertTrue($locator->has('foo')); + $this->assertTrue($locator->has('bar')); + $this->assertFalse($locator->has('dummy')); + } + public function testGet() + { + $locator = $this->getServiceLocator(['foo' => function () { + return 'bar'; + }, 'bar' => function () { + return 'baz'; + }]); + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('baz', $locator->get('bar')); + } + public function testGetDoesNotMemoize() + { + $i = 0; + $locator = $this->getServiceLocator(['foo' => function () use(&$i) { + ++$i; + return 'bar'; + }]); + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame(2, $i); + } + public function testThrowsOnUndefinedInternalService() + { + $locator = $this->getServiceLocator(['foo' => function () use(&$locator) { + return $locator->get('bar'); + }]); + if (!$this->getExpectedException()) { + $this->expectException(NotFoundExceptionInterface::class); + $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); + } + $locator->get('foo'); + } + public function testThrowsOnCircularReference() + { + $locator = $this->getServiceLocator(['foo' => function () use(&$locator) { + return $locator->get('bar'); + }, 'bar' => function () use(&$locator) { + return $locator->get('baz'); + }, 'baz' => function () use(&$locator) { + return $locator->get('bar'); + }]); + $this->expectException(ContainerExceptionInterface::class); + $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); + $locator->get('foo'); + } +} diff --git a/vendor/symfony/service-contracts/composer.json b/vendor/symfony/service-contracts/composer.json new file mode 100644 index 00000000..cb1d22f9 --- /dev/null +++ b/vendor/symfony/service-contracts/composer.json @@ -0,0 +1,50 @@ +{ + "name": "symfony\/service-contracts", + "type": "library", + "description": "Generic abstractions related to writing services", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "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", + "psr\/container": "^1.1|^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "\/Test\/" + ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony\/contracts", + "url": "https:\/\/github.com\/symfony\/contracts" + } + } +} \ No newline at end of file diff --git a/vendor/symfony/string/AbstractString.php b/vendor/symfony/string/AbstractString.php new file mode 100644 index 00000000..0e1616d2 --- /dev/null +++ b/vendor/symfony/string/AbstractString.php @@ -0,0 +1,645 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String; + +use RuleDocGenerator202403\Symfony\Component\String\Exception\ExceptionInterface; +use RuleDocGenerator202403\Symfony\Component\String\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\String\Exception\RuntimeException; +/** + * Represents a string of abstract characters. + * + * Unicode defines 3 types of "characters" (bytes, code points and grapheme clusters). + * This class is the abstract type to use as a type-hint when the logic you want to + * implement doesn't care about the exact variant it deals with. + * + * @author Nicolas Grekas + * @author Hugo Hamon + * + * @throws ExceptionInterface + */ +abstract class AbstractString implements \JsonSerializable +{ + public const PREG_PATTERN_ORDER = \PREG_PATTERN_ORDER; + public const PREG_SET_ORDER = \PREG_SET_ORDER; + public const PREG_OFFSET_CAPTURE = \PREG_OFFSET_CAPTURE; + public const PREG_UNMATCHED_AS_NULL = \PREG_UNMATCHED_AS_NULL; + public const PREG_SPLIT = 0; + public const PREG_SPLIT_NO_EMPTY = \PREG_SPLIT_NO_EMPTY; + public const PREG_SPLIT_DELIM_CAPTURE = \PREG_SPLIT_DELIM_CAPTURE; + public const PREG_SPLIT_OFFSET_CAPTURE = \PREG_SPLIT_OFFSET_CAPTURE; + /** + * @var string + */ + protected $string = ''; + /** + * @var bool|null + */ + protected $ignoreCase = \false; + public abstract function __construct(string $string = ''); + /** + * Unwraps instances of AbstractString back to strings. + * + * @return string[]|array + */ + public static function unwrap(array $values) : array + { + foreach ($values as $k => $v) { + if ($v instanceof self) { + $values[$k] = $v->__toString(); + } elseif (\is_array($v) && $values[$k] !== ($v = static::unwrap($v))) { + $values[$k] = $v; + } + } + return $values; + } + /** + * Wraps (and normalizes) strings in instances of AbstractString. + * + * @return static[]|array + */ + public static function wrap(array $values) : array + { + $i = 0; + $keys = null; + foreach ($values as $k => $v) { + if (\is_string($k) && '' !== $k && $k !== ($j = (string) new static($k))) { + $keys = $keys ?? \array_keys($values); + $keys[$i] = $j; + } + if (\is_string($v)) { + $values[$k] = new static($v); + } elseif (\is_array($v) && $values[$k] !== ($v = static::wrap($v))) { + $values[$k] = $v; + } + ++$i; + } + return null !== $keys ? \array_combine($keys, $values) : $values; + } + /** + * @param string|string[] $needle + * @return static + */ + public function after($needle, bool $includeNeedle = \false, int $offset = 0) + { + $str = clone $this; + $i = \PHP_INT_MAX; + if (\is_string($needle)) { + $needle = [$needle]; + } + foreach ($needle as $n) { + $n = (string) $n; + $j = $this->indexOf($n, $offset); + if (null !== $j && $j < $i) { + $i = $j; + $str->string = $n; + } + } + if (\PHP_INT_MAX === $i) { + return $str; + } + if (!$includeNeedle) { + $i += $str->length(); + } + return $this->slice($i); + } + /** + * @param string|string[] $needle + * @return static + */ + public function afterLast($needle, bool $includeNeedle = \false, int $offset = 0) + { + $str = clone $this; + $i = null; + if (\is_string($needle)) { + $needle = [$needle]; + } + foreach ($needle as $n) { + $n = (string) $n; + $j = $this->indexOfLast($n, $offset); + if (null !== $j && $j >= $i) { + $i = $offset = $j; + $str->string = $n; + } + } + if (null === $i) { + return $str; + } + if (!$includeNeedle) { + $i += $str->length(); + } + return $this->slice($i); + } + /** + * @return static + */ + public abstract function append(string ...$suffix); + /** + * @param string|string[] $needle + * @return static + */ + public function before($needle, bool $includeNeedle = \false, int $offset = 0) + { + $str = clone $this; + $i = \PHP_INT_MAX; + if (\is_string($needle)) { + $needle = [$needle]; + } + foreach ($needle as $n) { + $n = (string) $n; + $j = $this->indexOf($n, $offset); + if (null !== $j && $j < $i) { + $i = $j; + $str->string = $n; + } + } + if (\PHP_INT_MAX === $i) { + return $str; + } + if ($includeNeedle) { + $i += $str->length(); + } + return $this->slice(0, $i); + } + /** + * @param string|string[] $needle + * @return static + */ + public function beforeLast($needle, bool $includeNeedle = \false, int $offset = 0) + { + $str = clone $this; + $i = null; + if (\is_string($needle)) { + $needle = [$needle]; + } + foreach ($needle as $n) { + $n = (string) $n; + $j = $this->indexOfLast($n, $offset); + if (null !== $j && $j >= $i) { + $i = $offset = $j; + $str->string = $n; + } + } + if (null === $i) { + return $str; + } + if ($includeNeedle) { + $i += $str->length(); + } + return $this->slice(0, $i); + } + /** + * @return int[] + */ + public function bytesAt(int $offset) : array + { + $str = $this->slice($offset, 1); + return '' === $str->string ? [] : \array_values(\unpack('C*', $str->string)); + } + /** + * @return static + */ + public abstract function camel(); + /** + * @return static[] + */ + public abstract function chunk(int $length = 1) : array; + /** + * @return static + */ + public function collapseWhitespace() + { + $str = clone $this; + $str->string = \trim(\preg_replace("/(?:[ \n\r\t\f]{2,}+|[\n\r\t\f])/", ' ', $str->string), " \n\r\t\f"); + return $str; + } + /** + * @param string|string[] $needle + */ + public function containsAny($needle) : bool + { + return null !== $this->indexOf($needle); + } + /** + * @param string|string[] $suffix + */ + public function endsWith($suffix) : bool + { + if (\is_string($suffix)) { + throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); + } + foreach ($suffix as $s) { + if ($this->endsWith((string) $s)) { + return \true; + } + } + return \false; + } + /** + * @return static + */ + public function ensureEnd(string $suffix) + { + if (!$this->endsWith($suffix)) { + return $this->append($suffix); + } + $suffix = \preg_quote($suffix); + $regex = '{(' . $suffix . ')(?:' . $suffix . ')++$}D'; + return $this->replaceMatches($regex . ($this->ignoreCase ? 'i' : ''), '$1'); + } + /** + * @return static + */ + public function ensureStart(string $prefix) + { + $prefix = new static($prefix); + if (!$this->startsWith($prefix)) { + return $this->prepend($prefix); + } + $str = clone $this; + $i = $prefixLen = $prefix->length(); + while ($this->indexOf($prefix, $i) === $i) { + $str = $str->slice($prefixLen); + $i += $prefixLen; + } + return $str; + } + /** + * @param string|string[] $string + */ + public function equalsTo($string) : bool + { + if (\is_string($string)) { + throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); + } + foreach ($string as $s) { + if ($this->equalsTo((string) $s)) { + return \true; + } + } + return \false; + } + /** + * @return static + */ + public abstract function folded(); + /** + * @return static + */ + public function ignoreCase() + { + $str = clone $this; + $str->ignoreCase = \true; + return $str; + } + /** + * @param string|string[] $needle + */ + public function indexOf($needle, int $offset = 0) : ?int + { + if (\is_string($needle)) { + throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); + } + $i = \PHP_INT_MAX; + foreach ($needle as $n) { + $j = $this->indexOf((string) $n, $offset); + if (null !== $j && $j < $i) { + $i = $j; + } + } + return \PHP_INT_MAX === $i ? null : $i; + } + /** + * @param string|string[] $needle + */ + public function indexOfLast($needle, int $offset = 0) : ?int + { + if (\is_string($needle)) { + throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); + } + $i = null; + foreach ($needle as $n) { + $j = $this->indexOfLast((string) $n, $offset); + if (null !== $j && $j >= $i) { + $i = $offset = $j; + } + } + return $i; + } + public function isEmpty() : bool + { + return '' === $this->string; + } + /** + * @return static + */ + public abstract function join(array $strings, ?string $lastGlue = null); + public function jsonSerialize() : string + { + return $this->string; + } + public abstract function length() : int; + /** + * @return static + */ + public abstract function lower(); + /** + * Matches the string using a regular expression. + * + * Pass PREG_PATTERN_ORDER or PREG_SET_ORDER as $flags to get all occurrences matching the regular expression. + * + * @return array All matches in a multi-dimensional array ordered according to flags + */ + public abstract function match(string $regexp, int $flags = 0, int $offset = 0) : array; + /** + * @return static + */ + public abstract function padBoth(int $length, string $padStr = ' '); + /** + * @return static + */ + public abstract function padEnd(int $length, string $padStr = ' '); + /** + * @return static + */ + public abstract function padStart(int $length, string $padStr = ' '); + /** + * @return static + */ + public abstract function prepend(string ...$prefix); + /** + * @return static + */ + public function repeat(int $multiplier) + { + if (0 > $multiplier) { + throw new InvalidArgumentException(\sprintf('Multiplier must be positive, %d given.', $multiplier)); + } + $str = clone $this; + $str->string = \str_repeat($str->string, $multiplier); + return $str; + } + /** + * @return static + */ + public abstract function replace(string $from, string $to); + /** + * @param string|callable $to + * @return static + */ + public abstract function replaceMatches(string $fromRegexp, $to); + /** + * @return static + */ + public abstract function reverse(); + /** + * @return static + */ + public abstract function slice(int $start = 0, ?int $length = null); + /** + * @return static + */ + public abstract function snake(); + /** + * @return static + */ + public abstract function splice(string $replacement, int $start = 0, ?int $length = null); + /** + * @return static[] + */ + public function split(string $delimiter, ?int $limit = null, ?int $flags = null) : array + { + if (null === $flags) { + throw new \TypeError('Split behavior when $flags is null must be implemented by child classes.'); + } + if ($this->ignoreCase) { + $delimiter .= 'i'; + } + \set_error_handler(static function ($t, $m) { + throw new InvalidArgumentException($m); + }); + try { + if (\false === ($chunks = \preg_split($delimiter, $this->string, $limit, $flags))) { + throw new RuntimeException('Splitting failed with error: ' . \preg_last_error_msg()); + } + } finally { + \restore_error_handler(); + } + $str = clone $this; + if (self::PREG_SPLIT_OFFSET_CAPTURE & $flags) { + foreach ($chunks as &$chunk) { + $str->string = $chunk[0]; + $chunk[0] = clone $str; + } + } else { + foreach ($chunks as &$chunk) { + $str->string = $chunk; + $chunk = clone $str; + } + } + return $chunks; + } + /** + * @param string|string[] $prefix + */ + public function startsWith($prefix) : bool + { + if (\is_string($prefix)) { + throw new \TypeError(\sprintf('Method "%s()" must be overridden by class "%s" to deal with non-iterable values.', __FUNCTION__, static::class)); + } + foreach ($prefix as $prefix) { + if ($this->startsWith((string) $prefix)) { + return \true; + } + } + return \false; + } + /** + * @return static + */ + public abstract function title(bool $allWords = \false); + public function toByteString(?string $toEncoding = null) : ByteString + { + $b = new ByteString(); + $toEncoding = \in_array($toEncoding, ['utf8', 'utf-8', 'UTF8'], \true) ? 'UTF-8' : $toEncoding; + if (null === $toEncoding || $toEncoding === ($fromEncoding = $this instanceof AbstractUnicodeString || \preg_match('//u', $b->string) ? 'UTF-8' : 'Windows-1252')) { + $b->string = $this->string; + return $b; + } + try { + $b->string = \mb_convert_encoding($this->string, $toEncoding, 'UTF-8'); + } catch (\ValueError $e) { + if (!\function_exists('iconv')) { + throw new InvalidArgumentException($e->getMessage(), $e->getCode(), $e); + } + $b->string = \iconv('UTF-8', $toEncoding, $this->string); + } + return $b; + } + public function toCodePointString() : CodePointString + { + return new CodePointString($this->string); + } + public function toString() : string + { + return $this->string; + } + public function toUnicodeString() : UnicodeString + { + return new UnicodeString($this->string); + } + /** + * @return static + */ + public abstract function trim(string $chars = " \t\n\r\x00\v\f "); + /** + * @return static + */ + public abstract function trimEnd(string $chars = " \t\n\r\x00\v\f "); + /** + * @param string|string[] $prefix + * @return static + */ + public function trimPrefix($prefix) + { + if (\is_array($prefix) || $prefix instanceof \Traversable) { + // don't use is_iterable(), it's slow + foreach ($prefix as $s) { + $t = $this->trimPrefix($s); + if ($t->string !== $this->string) { + return $t; + } + } + return clone $this; + } + $str = clone $this; + if ($prefix instanceof self) { + $prefix = $prefix->string; + } else { + $prefix = (string) $prefix; + } + if ('' !== $prefix && \strlen($this->string) >= \strlen($prefix) && 0 === \substr_compare($this->string, $prefix, 0, \strlen($prefix), $this->ignoreCase)) { + $str->string = \substr($this->string, \strlen($prefix)); + } + return $str; + } + /** + * @return static + */ + public abstract function trimStart(string $chars = " \t\n\r\x00\v\f "); + /** + * @param string|string[] $suffix + * @return static + */ + public function trimSuffix($suffix) + { + if (\is_array($suffix) || $suffix instanceof \Traversable) { + // don't use is_iterable(), it's slow + foreach ($suffix as $s) { + $t = $this->trimSuffix($s); + if ($t->string !== $this->string) { + return $t; + } + } + return clone $this; + } + $str = clone $this; + if ($suffix instanceof self) { + $suffix = $suffix->string; + } else { + $suffix = (string) $suffix; + } + if ('' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === \substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase)) { + $str->string = \substr($this->string, 0, -\strlen($suffix)); + } + return $str; + } + /** + * @return static + */ + public function truncate(int $length, string $ellipsis = '', bool $cut = \true) + { + $stringLength = $this->length(); + if ($stringLength <= $length) { + return clone $this; + } + $ellipsisLength = '' !== $ellipsis ? (new static($ellipsis))->length() : 0; + if ($length < $ellipsisLength) { + $ellipsisLength = 0; + } + if (!$cut) { + if (null === ($length = $this->indexOf([' ', "\r", "\n", "\t"], ($length ?: 1) - 1))) { + return clone $this; + } + $length += $ellipsisLength; + } + $str = $this->slice(0, $length - $ellipsisLength); + return $ellipsisLength ? $str->trimEnd()->append($ellipsis) : $str; + } + /** + * @return static + */ + public abstract function upper(); + /** + * Returns the printable length on a terminal. + */ + public abstract function width(bool $ignoreAnsiDecoration = \true) : int; + /** + * @return static + */ + public function wordwrap(int $width = 75, string $break = "\n", bool $cut = \false) + { + $lines = '' !== $break ? $this->split($break) : [clone $this]; + $chars = []; + $mask = ''; + if (1 === \count($lines) && '' === $lines[0]->string) { + return $lines[0]; + } + foreach ($lines as $i => $line) { + if ($i) { + $chars[] = $break; + $mask .= '#'; + } + foreach ($line->chunk() as $char) { + $chars[] = $char->string; + $mask .= ' ' === $char->string ? ' ' : '?'; + } + } + $string = ''; + $j = 0; + $b = $i = -1; + $mask = \wordwrap($mask, $width, '#', $cut); + while (\false !== ($b = \strpos($mask, '#', $b + 1))) { + for (++$i; $i < $b; ++$i) { + $string .= $chars[$j]; + unset($chars[$j++]); + } + if ($break === $chars[$j] || ' ' === $chars[$j]) { + unset($chars[$j++]); + } + $string .= $break; + } + $str = clone $this; + $str->string = $string . \implode('', $chars); + return $str; + } + public function __sleep() : array + { + return ['string']; + } + public function __clone() + { + $this->ignoreCase = \false; + } + public function __toString() : string + { + return $this->string; + } +} diff --git a/vendor/symfony/string/AbstractUnicodeString.php b/vendor/symfony/string/AbstractUnicodeString.php new file mode 100644 index 00000000..c47256a8 --- /dev/null +++ b/vendor/symfony/string/AbstractUnicodeString.php @@ -0,0 +1,532 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String; + +use RuleDocGenerator202403\Symfony\Component\String\Exception\ExceptionInterface; +use RuleDocGenerator202403\Symfony\Component\String\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\String\Exception\RuntimeException; +/** + * Represents a string of abstract Unicode characters. + * + * Unicode defines 3 types of "characters" (bytes, code points and grapheme clusters). + * This class is the abstract type to use as a type-hint when the logic you want to + * implement is Unicode-aware but doesn't care about code points vs grapheme clusters. + * + * @author Nicolas Grekas + * + * @throws ExceptionInterface + */ +abstract class AbstractUnicodeString extends AbstractString +{ + public const NFC = \Normalizer::NFC; + public const NFD = \Normalizer::NFD; + public const NFKC = \Normalizer::NFKC; + public const NFKD = \Normalizer::NFKD; + // all ASCII letters sorted by typical frequency of occurrence + private const ASCII = " eiasntrolud][cmp'\ng|hv.fb,:=-q10C2*yx)(L9AS/P\"EjMIk3>5T>', '<', '>', '-', '-', '-', '-', '-', '-', '-', '-', '-', '||', '/', '[', ']', '*', ',', '.', '<', '>', '<<', '>>', '[', ']', '[', ']', '[', ']', ',', '.', '[', ']', '<<', '>>', '<', '>', ',', '[', ']', '((', '))', '.', ',', '*', '/', '-', '/', '\\', '|', '||', '<<', '>>', '((', '))']; + /** + * @var mixed[] + */ + private static $transliterators = []; + /** + * @var mixed[] + */ + private static $tableZero; + /** + * @var mixed[] + */ + private static $tableWide; + /** + * @return static + */ + public static function fromCodePoints(int ...$codes) + { + $string = ''; + foreach ($codes as $code) { + if (0x80 > ($code %= 0x200000)) { + $string .= \chr($code); + } elseif (0x800 > $code) { + $string .= \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); + } elseif (0x10000 > $code) { + $string .= \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); + } else { + $string .= \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); + } + } + return new static($string); + } + /** + * Generic UTF-8 to ASCII transliteration. + * + * Install the intl extension for best results. + * + * @param string[]|\Transliterator[]|\Closure[] $rules See "*-Latin" rules from Transliterator::listIDs() + */ + public function ascii(array $rules = []) : self + { + $str = clone $this; + $s = $str->string; + $str->string = ''; + \array_unshift($rules, 'nfd'); + $rules[] = 'latin-ascii'; + if (\function_exists('transliterator_transliterate')) { + $rules[] = 'any-latin/bgn'; + } + $rules[] = 'nfkd'; + $rules[] = '[:nonspacing mark:] remove'; + while (\strlen($s) - 1 > ($i = \strspn($s, self::ASCII))) { + if (0 < --$i) { + $str->string .= \substr($s, 0, $i); + $s = \substr($s, $i); + } + if (!($rule = \array_shift($rules))) { + $rules = []; + // An empty rule interrupts the next ones + } + if ($rule instanceof \Transliterator) { + $s = $rule->transliterate($s); + } elseif ($rule instanceof \Closure) { + $s = $rule($s); + } elseif ($rule) { + if ('nfd' === ($rule = \strtolower($rule))) { + \normalizer_is_normalized($s, self::NFD) ?: ($s = \normalizer_normalize($s, self::NFD)); + } elseif ('nfkd' === $rule) { + \normalizer_is_normalized($s, self::NFKD) ?: ($s = \normalizer_normalize($s, self::NFKD)); + } elseif ('[:nonspacing mark:] remove' === $rule) { + $s = \preg_replace('/\\p{Mn}++/u', '', $s); + } elseif ('latin-ascii' === $rule) { + $s = \str_replace(self::TRANSLIT_FROM, self::TRANSLIT_TO, $s); + } elseif ('de-ascii' === $rule) { + $s = \preg_replace("/([AUO])̈(?=\\p{Ll})/u", '$1e', $s); + $s = \str_replace(["ä", "ö", "ü", "Ä", "Ö", "Ü"], ['ae', 'oe', 'ue', 'AE', 'OE', 'UE'], $s); + } elseif (\function_exists('transliterator_transliterate')) { + if (null === ($transliterator = self::$transliterators[$rule] = self::$transliterators[$rule] ?? \Transliterator::create($rule))) { + if ('any-latin/bgn' === $rule) { + $rule = 'any-latin'; + $transliterator = self::$transliterators[$rule] = self::$transliterators[$rule] ?? \Transliterator::create($rule); + } + if (null === $transliterator) { + throw new InvalidArgumentException(\sprintf('Unknown transliteration rule "%s".', $rule)); + } + self::$transliterators['any-latin/bgn'] = $transliterator; + } + $s = $transliterator->transliterate($s); + } + } elseif (!\function_exists('iconv')) { + $s = \preg_replace('/[^\\x00-\\x7F]/u', '?', $s); + } else { + $s = @\preg_replace_callback('/[^\\x00-\\x7F]/u', static function ($c) { + $c = (string) \iconv('UTF-8', 'ASCII//TRANSLIT', $c[0]); + if ('' === $c && '' === \iconv('UTF-8', 'ASCII//TRANSLIT', '²')) { + throw new \LogicException(\sprintf('"%s" requires a translit-able iconv implementation, try installing "gnu-libiconv" if you\'re using Alpine Linux.', static::class)); + } + return 1 < \strlen($c) ? \ltrim($c, '\'`"^~') : ('' !== $c ? $c : '?'); + }, $s); + } + } + $str->string .= $s; + return $str; + } + /** + * @return static + */ + public function camel() + { + $str = clone $this; + $str->string = \str_replace(' ', '', \preg_replace_callback('/\\b.(?![A-Z]{2,})/u', static function ($m) { + static $i = 0; + return 1 === ++$i ? 'İ' === $m[0] ? 'i̇' : \mb_strtolower($m[0], 'UTF-8') : \mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'); + }, \preg_replace('/[^\\pL0-9]++/u', ' ', $this->string))); + return $str; + } + /** + * @return int[] + */ + public function codePointsAt(int $offset) : array + { + $str = $this->slice($offset, 1); + if ('' === $str->string) { + return []; + } + $codePoints = []; + foreach (\preg_split('//u', $str->string, -1, \PREG_SPLIT_NO_EMPTY) as $c) { + $codePoints[] = \mb_ord($c, 'UTF-8'); + } + return $codePoints; + } + /** + * @return static + */ + public function folded(bool $compat = \true) + { + $str = clone $this; + if (!$compat || !\defined('Normalizer::NFKC_CF')) { + $str->string = \normalizer_normalize($str->string, $compat ? \Normalizer::NFKC : \Normalizer::NFC); + $str->string = \mb_strtolower(\str_replace(self::FOLD_FROM, self::FOLD_TO, $this->string), 'UTF-8'); + } else { + $str->string = \normalizer_normalize($str->string, \Normalizer::NFKC_CF); + } + return $str; + } + /** + * @return static + */ + public function join(array $strings, ?string $lastGlue = null) + { + $str = clone $this; + $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue . \array_pop($strings) : ''; + $str->string = \implode($this->string, $strings) . $tail; + if (!\preg_match('//u', $str->string)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + return $str; + } + /** + * @return static + */ + public function lower() + { + $str = clone $this; + $str->string = \mb_strtolower(\str_replace('İ', 'i̇', $str->string), 'UTF-8'); + return $str; + } + public function match(string $regexp, int $flags = 0, int $offset = 0) : array + { + $match = (\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags ? 'preg_match_all' : 'preg_match'; + if ($this->ignoreCase) { + $regexp .= 'i'; + } + \set_error_handler(static function ($t, $m) { + throw new InvalidArgumentException($m); + }); + try { + if (\false === $match($regexp . 'u', $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) { + throw new RuntimeException('Matching failed with error: ' . \preg_last_error_msg()); + } + } finally { + \restore_error_handler(); + } + return $matches; + } + /** + * @return static + */ + public function normalize(int $form = self::NFC) + { + if (!\in_array($form, [self::NFC, self::NFD, self::NFKC, self::NFKD])) { + throw new InvalidArgumentException('Unsupported normalization form.'); + } + $str = clone $this; + \normalizer_is_normalized($str->string, $form) ?: ($str->string = \normalizer_normalize($str->string, $form)); + return $str; + } + /** + * @return static + */ + public function padBoth(int $length, string $padStr = ' ') + { + if ('' === $padStr || !\preg_match('//u', $padStr)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + $pad = clone $this; + $pad->string = $padStr; + return $this->pad($length, $pad, \STR_PAD_BOTH); + } + /** + * @return static + */ + public function padEnd(int $length, string $padStr = ' ') + { + if ('' === $padStr || !\preg_match('//u', $padStr)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + $pad = clone $this; + $pad->string = $padStr; + return $this->pad($length, $pad, \STR_PAD_RIGHT); + } + /** + * @return static + */ + public function padStart(int $length, string $padStr = ' ') + { + if ('' === $padStr || !\preg_match('//u', $padStr)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + $pad = clone $this; + $pad->string = $padStr; + return $this->pad($length, $pad, \STR_PAD_LEFT); + } + /** + * @param string|callable $to + * @return static + */ + public function replaceMatches(string $fromRegexp, $to) + { + if ($this->ignoreCase) { + $fromRegexp .= 'i'; + } + if (\is_array($to) || $to instanceof \Closure) { + $replace = 'preg_replace_callback'; + $to = static function (array $m) use($to) : string { + $to = $to($m); + if ('' !== $to && (!\is_string($to) || !\preg_match('//u', $to))) { + throw new InvalidArgumentException('Replace callback must return a valid UTF-8 string.'); + } + return $to; + }; + } elseif ('' !== $to && !\preg_match('//u', $to)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } else { + $replace = 'preg_replace'; + } + \set_error_handler(static function ($t, $m) { + throw new InvalidArgumentException($m); + }); + try { + if (null === ($string = $replace($fromRegexp . 'u', $to, $this->string))) { + $lastError = \preg_last_error(); + foreach (\get_defined_constants(\true)['pcre'] as $k => $v) { + if ($lastError === $v && \substr_compare($k, '_ERROR', -\strlen('_ERROR')) === 0) { + throw new RuntimeException('Matching failed with ' . $k . '.'); + } + } + throw new RuntimeException('Matching failed with unknown error code.'); + } + } finally { + \restore_error_handler(); + } + $str = clone $this; + $str->string = $string; + return $str; + } + /** + * @return static + */ + public function reverse() + { + $str = clone $this; + $str->string = \implode('', \array_reverse(\preg_split('/(\\X)/u', $str->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY))); + return $str; + } + /** + * @return static + */ + public function snake() + { + $str = $this->camel(); + $str->string = \mb_strtolower(\preg_replace(['/(\\p{Lu}+)(\\p{Lu}\\p{Ll})/u', '/([\\p{Ll}0-9])(\\p{Lu})/u'], 'RuleDocGenerator202403\\1_\\2', $str->string), 'UTF-8'); + return $str; + } + /** + * @return static + */ + public function title(bool $allWords = \false) + { + $str = clone $this; + $limit = $allWords ? -1 : 1; + $str->string = \preg_replace_callback('/\\b./u', static function (array $m) : string { + return \mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'); + }, $str->string, $limit); + return $str; + } + /** + * @return static + */ + public function trim(string $chars = " \t\n\r\x00\v\f ") + { + if (" \t\n\r\x00\v\f " !== $chars && !\preg_match('//u', $chars)) { + throw new InvalidArgumentException('Invalid UTF-8 chars.'); + } + $chars = \preg_quote($chars); + $str = clone $this; + $str->string = \preg_replace("{^[{$chars}]++|[{$chars}]++\$}uD", '', $str->string); + return $str; + } + /** + * @return static + */ + public function trimEnd(string $chars = " \t\n\r\x00\v\f ") + { + if (" \t\n\r\x00\v\f " !== $chars && !\preg_match('//u', $chars)) { + throw new InvalidArgumentException('Invalid UTF-8 chars.'); + } + $chars = \preg_quote($chars); + $str = clone $this; + $str->string = \preg_replace("{[{$chars}]++\$}uD", '', $str->string); + return $str; + } + /** + * @return static + */ + public function trimPrefix($prefix) + { + if (!$this->ignoreCase) { + return parent::trimPrefix($prefix); + } + $str = clone $this; + if ($prefix instanceof \Traversable) { + $prefix = \iterator_to_array($prefix, \false); + } elseif ($prefix instanceof parent) { + $prefix = $prefix->string; + } + $prefix = \implode('|', \array_map('preg_quote', (array) $prefix)); + $str->string = \preg_replace("{^(?:{$prefix})}iuD", '', $this->string); + return $str; + } + /** + * @return static + */ + public function trimStart(string $chars = " \t\n\r\x00\v\f ") + { + if (" \t\n\r\x00\v\f " !== $chars && !\preg_match('//u', $chars)) { + throw new InvalidArgumentException('Invalid UTF-8 chars.'); + } + $chars = \preg_quote($chars); + $str = clone $this; + $str->string = \preg_replace("{^[{$chars}]++}uD", '', $str->string); + return $str; + } + /** + * @return static + */ + public function trimSuffix($suffix) + { + if (!$this->ignoreCase) { + return parent::trimSuffix($suffix); + } + $str = clone $this; + if ($suffix instanceof \Traversable) { + $suffix = \iterator_to_array($suffix, \false); + } elseif ($suffix instanceof parent) { + $suffix = $suffix->string; + } + $suffix = \implode('|', \array_map('preg_quote', (array) $suffix)); + $str->string = \preg_replace("{(?:{$suffix})\$}iuD", '', $this->string); + return $str; + } + /** + * @return static + */ + public function upper() + { + $str = clone $this; + $str->string = \mb_strtoupper($str->string, 'UTF-8'); + return $str; + } + public function width(bool $ignoreAnsiDecoration = \true) : int + { + $width = 0; + $s = \str_replace(["\x00", "\x05", "\x07"], '', $this->string); + if (\strpos($s, "\r") !== \false) { + $s = \str_replace(["\r\n", "\r"], "\n", $s); + } + if (!$ignoreAnsiDecoration) { + $s = \preg_replace('/[\\p{Cc}\\x7F]++/u', '', $s); + } + foreach (\explode("\n", $s) as $s) { + if ($ignoreAnsiDecoration) { + $s = \preg_replace('/(?:\\x1B(?: + \\[ [\\x30-\\x3F]*+ [\\x20-\\x2F]*+ [\\x40-\\x7E] + | [P\\]X^_] .*? \\x1B\\\\ + | [\\x41-\\x7E] + )|[\\p{Cc}\\x7F]++)/xu', '', $s); + } + $lineWidth = $this->wcswidth($s); + if ($lineWidth > $width) { + $width = $lineWidth; + } + } + return $width; + } + /** + * @return static + */ + private function pad(int $len, self $pad, int $type) + { + $sLen = $this->length(); + if ($len <= $sLen) { + return clone $this; + } + $padLen = $pad->length(); + $freeLen = $len - $sLen; + $len = $freeLen % $padLen; + switch ($type) { + case \STR_PAD_RIGHT: + return $this->append(\str_repeat($pad->string, \intdiv($freeLen, $padLen)) . ($len ? $pad->slice(0, $len) : '')); + case \STR_PAD_LEFT: + return $this->prepend(\str_repeat($pad->string, \intdiv($freeLen, $padLen)) . ($len ? $pad->slice(0, $len) : '')); + case \STR_PAD_BOTH: + $freeLen /= 2; + $rightLen = \ceil($freeLen); + $len = $rightLen % $padLen; + $str = $this->append(\str_repeat($pad->string, \intdiv($rightLen, $padLen)) . ($len ? $pad->slice(0, $len) : '')); + $leftLen = \floor($freeLen); + $len = $leftLen % $padLen; + return $str->prepend(\str_repeat($pad->string, \intdiv($leftLen, $padLen)) . ($len ? $pad->slice(0, $len) : '')); + default: + throw new InvalidArgumentException('Invalid padding type.'); + } + } + /** + * Based on https://github.com/jquast/wcwidth, a Python implementation of https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c. + */ + private function wcswidth(string $string) : int + { + $width = 0; + foreach (\preg_split('//u', $string, -1, \PREG_SPLIT_NO_EMPTY) as $c) { + $codePoint = \mb_ord($c, 'UTF-8'); + if (0 === $codePoint || 0x34f === $codePoint || 0x200b <= $codePoint && 0x200f >= $codePoint || 0x2028 === $codePoint || 0x2029 === $codePoint || 0x202a <= $codePoint && 0x202e >= $codePoint || 0x2060 <= $codePoint && 0x2063 >= $codePoint) { + continue; + } + // Non printable characters + if (32 > $codePoint || 0x7f <= $codePoint && 0xa0 > $codePoint) { + return -1; + } + self::$tableZero = self::$tableZero ?? (require __DIR__ . '/Resources/data/wcswidth_table_zero.php'); + if ($codePoint >= self::$tableZero[0][0] && $codePoint <= self::$tableZero[$ubound = \count(self::$tableZero) - 1][1]) { + $lbound = 0; + while ($ubound >= $lbound) { + $mid = \floor(($lbound + $ubound) / 2); + if ($codePoint > self::$tableZero[$mid][1]) { + $lbound = $mid + 1; + } elseif ($codePoint < self::$tableZero[$mid][0]) { + $ubound = $mid - 1; + } else { + continue 2; + } + } + } + self::$tableWide = self::$tableWide ?? (require __DIR__ . '/Resources/data/wcswidth_table_wide.php'); + if ($codePoint >= self::$tableWide[0][0] && $codePoint <= self::$tableWide[$ubound = \count(self::$tableWide) - 1][1]) { + $lbound = 0; + while ($ubound >= $lbound) { + $mid = \floor(($lbound + $ubound) / 2); + if ($codePoint > self::$tableWide[$mid][1]) { + $lbound = $mid + 1; + } elseif ($codePoint < self::$tableWide[$mid][0]) { + $ubound = $mid - 1; + } else { + $width += 2; + continue 2; + } + } + } + ++$width; + } + return $width; + } +} diff --git a/vendor/symfony/string/ByteString.php b/vendor/symfony/string/ByteString.php new file mode 100644 index 00000000..19d55807 --- /dev/null +++ b/vendor/symfony/string/ByteString.php @@ -0,0 +1,459 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String; + +use RuleDocGenerator202403\Symfony\Component\String\Exception\ExceptionInterface; +use RuleDocGenerator202403\Symfony\Component\String\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\String\Exception\RuntimeException; +/** + * Represents a binary-safe string of bytes. + * + * @author Nicolas Grekas + * @author Hugo Hamon + * + * @throws ExceptionInterface + */ +class ByteString extends AbstractString +{ + private const ALPHABET_ALPHANUMERIC = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'; + public function __construct(string $string = '') + { + $this->string = $string; + } + /* + * The following method was derived from code of the Hack Standard Library (v4.40 - 2020-05-03) + * + * https://github.com/hhvm/hsl/blob/80a42c02f036f72a42f0415e80d6b847f4bf62d5/src/random/private.php#L16 + * + * Code subject to the MIT license (https://github.com/hhvm/hsl/blob/master/LICENSE). + * + * Copyright (c) 2004-2020, Facebook, Inc. (https://www.facebook.com/) + */ + public static function fromRandom(int $length = 16, ?string $alphabet = null) : self + { + if ($length <= 0) { + throw new InvalidArgumentException(\sprintf('A strictly positive length is expected, "%d" given.', $length)); + } + $alphabet = $alphabet ?? self::ALPHABET_ALPHANUMERIC; + $alphabetSize = \strlen($alphabet); + $bits = (int) \ceil(\log($alphabetSize, 2.0)); + if ($bits <= 0 || $bits > 56) { + throw new InvalidArgumentException('The length of the alphabet must in the [2^1, 2^56] range.'); + } + $ret = ''; + while ($length > 0) { + $urandomLength = (int) \ceil(2 * $length * $bits / 8.0); + $data = \random_bytes($urandomLength); + $unpackedData = 0; + $unpackedBits = 0; + for ($i = 0; $i < $urandomLength && $length > 0; ++$i) { + // Unpack 8 bits + $unpackedData = $unpackedData << 8 | \ord($data[$i]); + $unpackedBits += 8; + // While we have enough bits to select a character from the alphabet, keep + // consuming the random data + for (; $unpackedBits >= $bits && $length > 0; $unpackedBits -= $bits) { + $index = $unpackedData & (1 << $bits) - 1; + $unpackedData >>= $bits; + // Unfortunately, the alphabet size is not necessarily a power of two. + // Worst case, it is 2^k + 1, which means we need (k+1) bits and we + // have around a 50% chance of missing as k gets larger + if ($index < $alphabetSize) { + $ret .= $alphabet[$index]; + --$length; + } + } + } + } + return new static($ret); + } + public function bytesAt(int $offset) : array + { + $str = $this->string[$offset] ?? ''; + return '' === $str ? [] : [\ord($str)]; + } + /** + * @return static + */ + public function append(string ...$suffix) + { + $str = clone $this; + $str->string .= 1 >= \count($suffix) ? $suffix[0] ?? '' : \implode('', $suffix); + return $str; + } + /** + * @return static + */ + public function camel() + { + $str = clone $this; + $parts = \explode(' ', \trim(\ucwords(\preg_replace('/[^a-zA-Z0-9\\x7f-\\xff]++/', ' ', $this->string)))); + $parts[0] = 1 !== \strlen($parts[0]) && \ctype_upper($parts[0]) ? $parts[0] : \lcfirst($parts[0]); + $str->string = \implode('', $parts); + return $str; + } + public function chunk(int $length = 1) : array + { + if (1 > $length) { + throw new InvalidArgumentException('The chunk length must be greater than zero.'); + } + if ('' === $this->string) { + return []; + } + $str = clone $this; + $chunks = []; + foreach (\str_split($this->string, $length) as $chunk) { + $str->string = $chunk; + $chunks[] = clone $str; + } + return $chunks; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $suffix + */ + public function endsWith($suffix) : bool + { + if ($suffix instanceof AbstractString) { + $suffix = $suffix->string; + } elseif (!\is_string($suffix)) { + return parent::endsWith($suffix); + } + return '' !== $suffix && \strlen($this->string) >= \strlen($suffix) && 0 === \substr_compare($this->string, $suffix, -\strlen($suffix), null, $this->ignoreCase); + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $string + */ + public function equalsTo($string) : bool + { + if ($string instanceof AbstractString) { + $string = $string->string; + } elseif (!\is_string($string)) { + return parent::equalsTo($string); + } + if ('' !== $string && $this->ignoreCase) { + return 0 === \strcasecmp($string, $this->string); + } + return $string === $this->string; + } + /** + * @return static + */ + public function folded() + { + $str = clone $this; + $str->string = \strtolower($str->string); + return $str; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $needle + */ + public function indexOf($needle, int $offset = 0) : ?int + { + if ($needle instanceof AbstractString) { + $needle = $needle->string; + } elseif (!\is_string($needle)) { + return parent::indexOf($needle, $offset); + } + if ('' === $needle) { + return null; + } + $i = $this->ignoreCase ? \stripos($this->string, $needle, $offset) : \strpos($this->string, $needle, $offset); + return \false === $i ? null : $i; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $needle + */ + public function indexOfLast($needle, int $offset = 0) : ?int + { + if ($needle instanceof AbstractString) { + $needle = $needle->string; + } elseif (!\is_string($needle)) { + return parent::indexOfLast($needle, $offset); + } + if ('' === $needle) { + return null; + } + $i = $this->ignoreCase ? \strripos($this->string, $needle, $offset) : \strrpos($this->string, $needle, $offset); + return \false === $i ? null : $i; + } + public function isUtf8() : bool + { + return '' === $this->string || \preg_match('//u', $this->string); + } + /** + * @return static + */ + public function join(array $strings, ?string $lastGlue = null) + { + $str = clone $this; + $tail = null !== $lastGlue && 1 < \count($strings) ? $lastGlue . \array_pop($strings) : ''; + $str->string = \implode($this->string, $strings) . $tail; + return $str; + } + public function length() : int + { + return \strlen($this->string); + } + /** + * @return static + */ + public function lower() + { + $str = clone $this; + $str->string = \strtolower($str->string); + return $str; + } + public function match(string $regexp, int $flags = 0, int $offset = 0) : array + { + $match = (\PREG_PATTERN_ORDER | \PREG_SET_ORDER) & $flags ? 'preg_match_all' : 'preg_match'; + if ($this->ignoreCase) { + $regexp .= 'i'; + } + \set_error_handler(static function ($t, $m) { + throw new InvalidArgumentException($m); + }); + try { + if (\false === $match($regexp, $this->string, $matches, $flags | \PREG_UNMATCHED_AS_NULL, $offset)) { + throw new RuntimeException('Matching failed with error: ' . \preg_last_error_msg()); + } + } finally { + \restore_error_handler(); + } + return $matches; + } + /** + * @return static + */ + public function padBoth(int $length, string $padStr = ' ') + { + $str = clone $this; + $str->string = \str_pad($this->string, $length, $padStr, \STR_PAD_BOTH); + return $str; + } + /** + * @return static + */ + public function padEnd(int $length, string $padStr = ' ') + { + $str = clone $this; + $str->string = \str_pad($this->string, $length, $padStr, \STR_PAD_RIGHT); + return $str; + } + /** + * @return static + */ + public function padStart(int $length, string $padStr = ' ') + { + $str = clone $this; + $str->string = \str_pad($this->string, $length, $padStr, \STR_PAD_LEFT); + return $str; + } + /** + * @return static + */ + public function prepend(string ...$prefix) + { + $str = clone $this; + $str->string = (1 >= \count($prefix) ? $prefix[0] ?? '' : \implode('', $prefix)) . $str->string; + return $str; + } + /** + * @return static + */ + public function replace(string $from, string $to) + { + $str = clone $this; + if ('' !== $from) { + $str->string = $this->ignoreCase ? \str_ireplace($from, $to, $this->string) : \str_replace($from, $to, $this->string); + } + return $str; + } + /** + * @param string|callable $to + * @return static + */ + public function replaceMatches(string $fromRegexp, $to) + { + if ($this->ignoreCase) { + $fromRegexp .= 'i'; + } + $replace = \is_array($to) || $to instanceof \Closure ? 'preg_replace_callback' : 'preg_replace'; + \set_error_handler(static function ($t, $m) { + throw new InvalidArgumentException($m); + }); + try { + if (null === ($string = $replace($fromRegexp, $to, $this->string))) { + $lastError = \preg_last_error(); + foreach (\get_defined_constants(\true)['pcre'] as $k => $v) { + if ($lastError === $v && \substr_compare($k, '_ERROR', -\strlen('_ERROR')) === 0) { + throw new RuntimeException('Matching failed with ' . $k . '.'); + } + } + throw new RuntimeException('Matching failed with unknown error code.'); + } + } finally { + \restore_error_handler(); + } + $str = clone $this; + $str->string = $string; + return $str; + } + /** + * @return static + */ + public function reverse() + { + $str = clone $this; + $str->string = \strrev($str->string); + return $str; + } + /** + * @return static + */ + public function slice(int $start = 0, ?int $length = null) + { + $str = clone $this; + $str->string = (string) \substr($this->string, $start, $length ?? \PHP_INT_MAX); + return $str; + } + /** + * @return static + */ + public function snake() + { + $str = $this->camel(); + $str->string = \strtolower(\preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\\d])([A-Z])/'], 'RuleDocGenerator202403\\1_\\2', $str->string)); + return $str; + } + /** + * @return static + */ + public function splice(string $replacement, int $start = 0, ?int $length = null) + { + $str = clone $this; + $str->string = \substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX); + return $str; + } + public function split(string $delimiter, ?int $limit = null, ?int $flags = null) : array + { + if (1 > ($limit = $limit ?? \PHP_INT_MAX)) { + throw new InvalidArgumentException('Split limit must be a positive integer.'); + } + if ('' === $delimiter) { + throw new InvalidArgumentException('Split delimiter is empty.'); + } + if (null !== $flags) { + return parent::split($delimiter, $limit, $flags); + } + $str = clone $this; + $chunks = $this->ignoreCase ? \preg_split('{' . \preg_quote($delimiter) . '}iD', $this->string, $limit) : \explode($delimiter, $this->string, $limit); + foreach ($chunks as &$chunk) { + $str->string = $chunk; + $chunk = clone $str; + } + return $chunks; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $prefix + */ + public function startsWith($prefix) : bool + { + if ($prefix instanceof AbstractString) { + $prefix = $prefix->string; + } elseif (!\is_string($prefix)) { + return parent::startsWith($prefix); + } + return '' !== $prefix && 0 === ($this->ignoreCase ? \strncasecmp($this->string, $prefix, \strlen($prefix)) : \strncmp($this->string, $prefix, \strlen($prefix))); + } + /** + * @return static + */ + public function title(bool $allWords = \false) + { + $str = clone $this; + $str->string = $allWords ? \ucwords($str->string) : \ucfirst($str->string); + return $str; + } + public function toUnicodeString(?string $fromEncoding = null) : UnicodeString + { + return new UnicodeString($this->toCodePointString($fromEncoding)->string); + } + public function toCodePointString(?string $fromEncoding = null) : CodePointString + { + $u = new CodePointString(); + if (\in_array($fromEncoding, [null, 'utf8', 'utf-8', 'UTF8', 'UTF-8'], \true) && \preg_match('//u', $this->string)) { + $u->string = $this->string; + return $u; + } + \set_error_handler(static function ($t, $m) { + throw new InvalidArgumentException($m); + }); + try { + try { + $validEncoding = \false !== \mb_detect_encoding($this->string, $fromEncoding ?? 'Windows-1252', \true); + } catch (InvalidArgumentException $e) { + if (!\function_exists('iconv')) { + throw $e; + } + $u->string = \iconv($fromEncoding ?? 'Windows-1252', 'UTF-8', $this->string); + return $u; + } + } finally { + \restore_error_handler(); + } + if (!$validEncoding) { + throw new InvalidArgumentException(\sprintf('Invalid "%s" string.', $fromEncoding ?? 'Windows-1252')); + } + $u->string = \mb_convert_encoding($this->string, 'UTF-8', $fromEncoding ?? 'Windows-1252'); + return $u; + } + /** + * @return static + */ + public function trim(string $chars = " \t\n\r\x00\v\f") + { + $str = clone $this; + $str->string = \trim($str->string, $chars); + return $str; + } + /** + * @return static + */ + public function trimEnd(string $chars = " \t\n\r\x00\v\f") + { + $str = clone $this; + $str->string = \rtrim($str->string, $chars); + return $str; + } + /** + * @return static + */ + public function trimStart(string $chars = " \t\n\r\x00\v\f") + { + $str = clone $this; + $str->string = \ltrim($str->string, $chars); + return $str; + } + /** + * @return static + */ + public function upper() + { + $str = clone $this; + $str->string = \strtoupper($str->string); + return $str; + } + public function width(bool $ignoreAnsiDecoration = \true) : int + { + $string = \preg_match('//u', $this->string) ? $this->string : \preg_replace('/[\\x80-\\xFF]/', '?', $this->string); + return (new CodePointString($string))->width($ignoreAnsiDecoration); + } +} diff --git a/vendor/symfony/string/CHANGELOG.md b/vendor/symfony/string/CHANGELOG.md new file mode 100644 index 00000000..31a3b54d --- /dev/null +++ b/vendor/symfony/string/CHANGELOG.md @@ -0,0 +1,40 @@ +CHANGELOG +========= + +6.2 +--- + + * Add support for emoji in `AsciiSlugger` + +5.4 +--- + + * Add `trimSuffix()` and `trimPrefix()` methods + +5.3 +--- + + * Made `AsciiSlugger` fallback to parent locale's symbolsMap + +5.2.0 +----- + + * added a `FrenchInflector` class + +5.1.0 +----- + + * added the `AbstractString::reverse()` method + * made `AbstractString::width()` follow POSIX.1-2001 + * added `LazyString` which provides memoizing stringable objects + * The component is not marked as `@experimental` anymore + * added the `s()` helper method to get either an `UnicodeString` or `ByteString` instance, + depending of the input string UTF-8 compliancy + * added `$cut` parameter to `Symfony\Component\String\AbstractString::truncate()` + * added `AbstractString::containsAny()` + * allow passing a string of custom characters to `ByteString::fromRandom()` + +5.0.0 +----- + + * added the component as experimental diff --git a/vendor/symfony/string/CodePointString.php b/vendor/symfony/string/CodePointString.php new file mode 100644 index 00000000..f1386e3c --- /dev/null +++ b/vendor/symfony/string/CodePointString.php @@ -0,0 +1,234 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String; + +use RuleDocGenerator202403\Symfony\Component\String\Exception\ExceptionInterface; +use RuleDocGenerator202403\Symfony\Component\String\Exception\InvalidArgumentException; +/** + * Represents a string of Unicode code points encoded as UTF-8. + * + * @author Nicolas Grekas + * @author Hugo Hamon + * + * @throws ExceptionInterface + */ +class CodePointString extends AbstractUnicodeString +{ + public function __construct(string $string = '') + { + if ('' !== $string && !\preg_match('//u', $string)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + $this->string = $string; + } + /** + * @return static + */ + public function append(string ...$suffix) + { + $str = clone $this; + $str->string .= 1 >= \count($suffix) ? $suffix[0] ?? '' : \implode('', $suffix); + if (!\preg_match('//u', $str->string)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + return $str; + } + public function chunk(int $length = 1) : array + { + if (1 > $length) { + throw new InvalidArgumentException('The chunk length must be greater than zero.'); + } + if ('' === $this->string) { + return []; + } + $rx = '/('; + while (65535 < $length) { + $rx .= '.{65535}'; + $length -= 65535; + } + $rx .= '.{' . $length . '})/us'; + $str = clone $this; + $chunks = []; + foreach (\preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) { + $str->string = $chunk; + $chunks[] = clone $str; + } + return $chunks; + } + public function codePointsAt(int $offset) : array + { + $str = $offset ? $this->slice($offset, 1) : $this; + return '' === $str->string ? [] : [\mb_ord($str->string, 'UTF-8')]; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $suffix + */ + public function endsWith($suffix) : bool + { + if ($suffix instanceof AbstractString) { + $suffix = $suffix->string; + } elseif (!\is_string($suffix)) { + return parent::endsWith($suffix); + } + if ('' === $suffix || !\preg_match('//u', $suffix)) { + return \false; + } + if ($this->ignoreCase) { + return \preg_match('{' . \preg_quote($suffix) . '$}iuD', $this->string); + } + return \strlen($this->string) >= \strlen($suffix) && 0 === \substr_compare($this->string, $suffix, -\strlen($suffix)); + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $string + */ + public function equalsTo($string) : bool + { + if ($string instanceof AbstractString) { + $string = $string->string; + } elseif (!\is_string($string)) { + return parent::equalsTo($string); + } + if ('' !== $string && $this->ignoreCase) { + return \strlen($string) === \strlen($this->string) && 0 === \mb_stripos($this->string, $string, 0, 'UTF-8'); + } + return $string === $this->string; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $needle + */ + public function indexOf($needle, int $offset = 0) : ?int + { + if ($needle instanceof AbstractString) { + $needle = $needle->string; + } elseif (!\is_string($needle)) { + return parent::indexOf($needle, $offset); + } + if ('' === $needle) { + return null; + } + $i = $this->ignoreCase ? \mb_stripos($this->string, $needle, $offset, 'UTF-8') : \mb_strpos($this->string, $needle, $offset, 'UTF-8'); + return \false === $i ? null : $i; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $needle + */ + public function indexOfLast($needle, int $offset = 0) : ?int + { + if ($needle instanceof AbstractString) { + $needle = $needle->string; + } elseif (!\is_string($needle)) { + return parent::indexOfLast($needle, $offset); + } + if ('' === $needle) { + return null; + } + $i = $this->ignoreCase ? \mb_strripos($this->string, $needle, $offset, 'UTF-8') : \mb_strrpos($this->string, $needle, $offset, 'UTF-8'); + return \false === $i ? null : $i; + } + public function length() : int + { + return \mb_strlen($this->string, 'UTF-8'); + } + /** + * @return static + */ + public function prepend(string ...$prefix) + { + $str = clone $this; + $str->string = (1 >= \count($prefix) ? $prefix[0] ?? '' : \implode('', $prefix)) . $this->string; + if (!\preg_match('//u', $str->string)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + return $str; + } + /** + * @return static + */ + public function replace(string $from, string $to) + { + $str = clone $this; + if ('' === $from || !\preg_match('//u', $from)) { + return $str; + } + if ('' !== $to && !\preg_match('//u', $to)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + if ($this->ignoreCase) { + $str->string = \implode($to, \preg_split('{' . \preg_quote($from) . '}iuD', $this->string)); + } else { + $str->string = \str_replace($from, $to, $this->string); + } + return $str; + } + /** + * @return static + */ + public function slice(int $start = 0, ?int $length = null) + { + $str = clone $this; + $str->string = \mb_substr($this->string, $start, $length, 'UTF-8'); + return $str; + } + /** + * @return static + */ + public function splice(string $replacement, int $start = 0, ?int $length = null) + { + if (!\preg_match('//u', $replacement)) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + $str = clone $this; + $start = $start ? \strlen(\mb_substr($this->string, 0, $start, 'UTF-8')) : 0; + $length = $length ? \strlen(\mb_substr($this->string, $start, $length, 'UTF-8')) : $length; + $str->string = \substr_replace($this->string, $replacement, $start, $length ?? \PHP_INT_MAX); + return $str; + } + public function split(string $delimiter, ?int $limit = null, ?int $flags = null) : array + { + if (1 > ($limit = $limit ?? \PHP_INT_MAX)) { + throw new InvalidArgumentException('Split limit must be a positive integer.'); + } + if ('' === $delimiter) { + throw new InvalidArgumentException('Split delimiter is empty.'); + } + if (null !== $flags) { + return parent::split($delimiter . 'u', $limit, $flags); + } + if (!\preg_match('//u', $delimiter)) { + throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.'); + } + $str = clone $this; + $chunks = $this->ignoreCase ? \preg_split('{' . \preg_quote($delimiter) . '}iuD', $this->string, $limit) : \explode($delimiter, $this->string, $limit); + foreach ($chunks as &$chunk) { + $str->string = $chunk; + $chunk = clone $str; + } + return $chunks; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $prefix + */ + public function startsWith($prefix) : bool + { + if ($prefix instanceof AbstractString) { + $prefix = $prefix->string; + } elseif (!\is_string($prefix)) { + return parent::startsWith($prefix); + } + if ('' === $prefix || !\preg_match('//u', $prefix)) { + return \false; + } + if ($this->ignoreCase) { + return 0 === \mb_stripos($this->string, $prefix, 0, 'UTF-8'); + } + return 0 === \strncmp($this->string, $prefix, \strlen($prefix)); + } +} diff --git a/vendor/symfony/string/Exception/ExceptionInterface.php b/vendor/symfony/string/Exception/ExceptionInterface.php new file mode 100644 index 00000000..cbce3df0 --- /dev/null +++ b/vendor/symfony/string/Exception/ExceptionInterface.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String\Exception; + +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/string/Exception/InvalidArgumentException.php b/vendor/symfony/string/Exception/InvalidArgumentException.php new file mode 100644 index 00000000..27a5d749 --- /dev/null +++ b/vendor/symfony/string/Exception/InvalidArgumentException.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String\Exception; + +class InvalidArgumentException extends \InvalidArgumentException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/string/Exception/RuntimeException.php b/vendor/symfony/string/Exception/RuntimeException.php new file mode 100644 index 00000000..ac77035a --- /dev/null +++ b/vendor/symfony/string/Exception/RuntimeException.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String\Exception; + +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/string/Inflector/EnglishInflector.php b/vendor/symfony/string/Inflector/EnglishInflector.php new file mode 100644 index 00000000..e399bee4 --- /dev/null +++ b/vendor/symfony/string/Inflector/EnglishInflector.php @@ -0,0 +1,404 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String\Inflector; + +final class EnglishInflector implements InflectorInterface +{ + /** + * Map English plural to singular suffixes. + * + * @see http://english-zone.com/spelling/plurals.html + */ + private const PLURAL_MAP = [ + // First entry: plural suffix, reversed + // Second entry: length of plural suffix + // Third entry: Whether the suffix may succeed a vowel + // Fourth entry: Whether the suffix may succeed a consonant + // Fifth entry: singular suffix, normal + // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) + ['a', 1, \true, \true, ['on', 'um']], + // nebulae (nebula) + ['ea', 2, \true, \true, 'a'], + // services (service) + ['secivres', 8, \true, \true, 'service'], + // mice (mouse), lice (louse) + ['eci', 3, \false, \true, 'ouse'], + // geese (goose) + ['esee', 4, \false, \true, 'oose'], + // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius) + ['i', 1, \true, \true, 'us'], + // men (man), women (woman) + ['nem', 3, \true, \true, 'man'], + // children (child) + ['nerdlihc', 8, \true, \true, 'child'], + // oxen (ox) + ['nexo', 4, \false, \false, 'ox'], + // indices (index), appendices (appendix), prices (price) + ['seci', 4, \false, \true, ['ex', 'ix', 'ice']], + // codes (code) + ['sedoc', 5, \false, \true, 'code'], + // selfies (selfie) + ['seifles', 7, \true, \true, 'selfie'], + // zombies (zombie) + ['seibmoz', 7, \true, \true, 'zombie'], + // movies (movie) + ['seivom', 6, \true, \true, 'movie'], + // names (name) + ['seman', 5, \true, \false, 'name'], + // conspectuses (conspectus), prospectuses (prospectus) + ['sesutcep', 8, \true, \true, 'pectus'], + // feet (foot) + ['teef', 4, \true, \true, 'foot'], + // geese (goose) + ['eseeg', 5, \true, \true, 'goose'], + // teeth (tooth) + ['hteet', 5, \true, \true, 'tooth'], + // news (news) + ['swen', 4, \true, \true, 'news'], + // series (series) + ['seires', 6, \true, \true, 'series'], + // babies (baby) + ['sei', 3, \false, \true, 'y'], + // accesses (access), addresses (address), kisses (kiss) + ['sess', 4, \true, \false, 'ss'], + // statuses (status) + ['sesutats', 8, \true, \true, 'status'], + // analyses (analysis), ellipses (ellipsis), fungi (fungus), + // neuroses (neurosis), theses (thesis), emphases (emphasis), + // oases (oasis), crises (crisis), houses (house), bases (base), + // atlases (atlas) + ['ses', 3, \true, \true, ['s', 'se', 'sis']], + // objectives (objective), alternative (alternatives) + ['sevit', 5, \true, \true, 'tive'], + // drives (drive) + ['sevird', 6, \false, \true, 'drive'], + // lives (life), wives (wife) + ['sevi', 4, \false, \true, 'ife'], + // moves (move) + ['sevom', 5, \true, \true, 'move'], + // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf), caves (cave), staves (staff) + ['sev', 3, \true, \true, ['f', 've', 'ff']], + // axes (axis), axes (ax), axes (axe) + ['sexa', 4, \false, \false, ['ax', 'axe', 'axis']], + // indexes (index), matrixes (matrix) + ['sex', 3, \true, \false, 'x'], + // quizzes (quiz) + ['sezz', 4, \true, \false, 'z'], + // bureaus (bureau) + ['suae', 4, \false, \true, 'eau'], + // fees (fee), trees (tree), employees (employee) + ['see', 3, \true, \true, 'ee'], + // edges (edge) + ['segd', 4, \true, \true, 'dge'], + // roses (rose), garages (garage), cassettes (cassette), + // waltzes (waltz), heroes (hero), bushes (bush), arches (arch), + // shoes (shoe) + ['se', 2, \true, \true, ['', 'e']], + // status (status) + ['sutats', 6, \true, \true, 'status'], + // tags (tag) + ['s', 1, \true, \true, ''], + // chateaux (chateau) + ['xuae', 4, \false, \true, 'eau'], + // people (person) + ['elpoep', 6, \true, \true, 'person'], + ]; + /** + * Map English singular to plural suffixes. + * + * @see http://english-zone.com/spelling/plurals.html + */ + private const SINGULAR_MAP = [ + // First entry: singular suffix, reversed + // Second entry: length of singular suffix + // Third entry: Whether the suffix may succeed a vowel + // Fourth entry: Whether the suffix may succeed a consonant + // Fifth entry: plural suffix, normal + // axes (axis) + ['sixa', 4, \false, \false, 'axes'], + // criterion (criteria) + ['airetirc', 8, \false, \false, 'criterion'], + // nebulae (nebula) + ['aluben', 6, \false, \false, 'nebulae'], + // children (child) + ['dlihc', 5, \true, \true, 'children'], + // prices (price) + ['eci', 3, \false, \true, 'ices'], + // services (service) + ['ecivres', 7, \true, \true, 'services'], + // lives (life), wives (wife) + ['efi', 3, \false, \true, 'ives'], + // selfies (selfie) + ['eifles', 6, \true, \true, 'selfies'], + // movies (movie) + ['eivom', 5, \true, \true, 'movies'], + // lice (louse) + ['esuol', 5, \false, \true, 'lice'], + // mice (mouse) + ['esuom', 5, \false, \true, 'mice'], + // geese (goose) + ['esoo', 4, \false, \true, 'eese'], + // houses (house), bases (base) + ['es', 2, \true, \true, 'ses'], + // geese (goose) + ['esoog', 5, \true, \true, 'geese'], + // caves (cave) + ['ev', 2, \true, \true, 'ves'], + // drives (drive) + ['evird', 5, \false, \true, 'drives'], + // objectives (objective), alternative (alternatives) + ['evit', 4, \true, \true, 'tives'], + // moves (move) + ['evom', 4, \true, \true, 'moves'], + // staves (staff) + ['ffats', 5, \true, \true, 'staves'], + // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf) + ['ff', 2, \true, \true, 'ffs'], + // hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf) + ['f', 1, \true, \true, ['fs', 'ves']], + // arches (arch) + ['hc', 2, \true, \true, 'ches'], + // bushes (bush) + ['hs', 2, \true, \true, 'shes'], + // teeth (tooth) + ['htoot', 5, \true, \true, 'teeth'], + // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) + ['mu', 2, \true, \true, 'a'], + // men (man), women (woman) + ['nam', 3, \true, \true, 'men'], + // people (person) + ['nosrep', 6, \true, \true, ['persons', 'people']], + // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) + ['noi', 3, \true, \true, 'ions'], + // coupon (coupons) + ['nop', 3, \true, \true, 'pons'], + // seasons (season), treasons (treason), poisons (poison), lessons (lesson) + ['nos', 3, \true, \true, 'sons'], + // icons (icon) + ['noc', 3, \true, \true, 'cons'], + // bacteria (bacterium), criteria (criterion), phenomena (phenomenon) + ['no', 2, \true, \true, 'a'], + // echoes (echo) + ['ohce', 4, \true, \true, 'echoes'], + // heroes (hero) + ['oreh', 4, \true, \true, 'heroes'], + // atlases (atlas) + ['salta', 5, \true, \true, 'atlases'], + // irises (iris) + ['siri', 4, \true, \true, 'irises'], + // analyses (analysis), ellipses (ellipsis), neuroses (neurosis) + // theses (thesis), emphases (emphasis), oases (oasis), + // crises (crisis) + ['sis', 3, \true, \true, 'ses'], + // accesses (access), addresses (address), kisses (kiss) + ['ss', 2, \true, \false, 'sses'], + // syllabi (syllabus) + ['suballys', 8, \true, \true, 'syllabi'], + // buses (bus) + ['sub', 3, \true, \true, 'buses'], + // circuses (circus) + ['suc', 3, \true, \true, 'cuses'], + // hippocampi (hippocampus) + ['supmacoppih', 11, \false, \false, 'hippocampi'], + // campuses (campus) + ['sup', 3, \true, \true, 'puses'], + // status (status) + ['sutats', 6, \true, \true, ['status', 'statuses']], + // conspectuses (conspectus), prospectuses (prospectus) + ['sutcep', 6, \true, \true, 'pectuses'], + // fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius) + ['su', 2, \true, \true, 'i'], + // news (news) + ['swen', 4, \true, \true, 'news'], + // feet (foot) + ['toof', 4, \true, \true, 'feet'], + // chateaux (chateau), bureaus (bureau) + ['uae', 3, \false, \true, ['eaus', 'eaux']], + // oxen (ox) + ['xo', 2, \false, \false, 'oxen'], + // hoaxes (hoax) + ['xaoh', 4, \true, \false, 'hoaxes'], + // indices (index) + ['xedni', 5, \false, \true, ['indicies', 'indexes']], + // boxes (box) + ['xo', 2, \false, \true, 'oxes'], + // indexes (index), matrixes (matrix) + ['x', 1, \true, \false, ['cies', 'xes']], + // appendices (appendix) + ['xi', 2, \false, \true, 'ices'], + // babies (baby) + ['y', 1, \false, \true, 'ies'], + // quizzes (quiz) + ['ziuq', 4, \true, \false, 'quizzes'], + // waltzes (waltz) + ['z', 1, \true, \true, 'zes'], + ]; + /** + * A list of words which should not be inflected, reversed. + */ + private const UNINFLECTED = [ + '', + // data + 'atad', + // deer + 'reed', + // equipment + 'tnempiuqe', + // feedback + 'kcabdeef', + // fish + 'hsif', + // health + 'htlaeh', + // history + 'yrotsih', + // info + 'ofni', + // information + 'noitamrofni', + // money + 'yenom', + // moose + 'esoom', + // series + 'seires', + // sheep + 'peehs', + // species + 'seiceps', + // traffic + 'ciffart', + // aircraft + 'tfarcria', + ]; + public function singularize(string $plural) : array + { + $pluralRev = \strrev($plural); + $lowerPluralRev = \strtolower($pluralRev); + $pluralLength = \strlen($lowerPluralRev); + // Check if the word is one which is not inflected, return early if so + if (\in_array($lowerPluralRev, self::UNINFLECTED, \true)) { + return [$plural]; + } + // The outer loop iterates over the entries of the plural table + // The inner loop $j iterates over the characters of the plural suffix + // in the plural table to compare them with the characters of the actual + // given plural suffix + foreach (self::PLURAL_MAP as $map) { + $suffix = $map[0]; + $suffixLength = $map[1]; + $j = 0; + // Compare characters in the plural table and of the suffix of the + // given plural one by one + while ($suffix[$j] === $lowerPluralRev[$j]) { + // Let $j point to the next character + ++$j; + // Successfully compared the last character + // Add an entry with the singular suffix to the singular array + if ($j === $suffixLength) { + // Is there any character preceding the suffix in the plural string? + if ($j < $pluralLength) { + $nextIsVowel = \strpos('aeiou', $lowerPluralRev[$j]) !== \false; + if (!$map[2] && $nextIsVowel) { + // suffix may not succeed a vowel but next char is one + break; + } + if (!$map[3] && !$nextIsVowel) { + // suffix may not succeed a consonant but next char is one + break; + } + } + $newBase = \substr($plural, 0, $pluralLength - $suffixLength); + $newSuffix = $map[4]; + // Check whether the first character in the plural suffix + // is uppercased. If yes, uppercase the first character in + // the singular suffix too + $firstUpper = \ctype_upper($pluralRev[$j - 1]); + if (\is_array($newSuffix)) { + $singulars = []; + foreach ($newSuffix as $newSuffixEntry) { + $singulars[] = $newBase . ($firstUpper ? \ucfirst($newSuffixEntry) : $newSuffixEntry); + } + return $singulars; + } + return [$newBase . ($firstUpper ? \ucfirst($newSuffix) : $newSuffix)]; + } + // Suffix is longer than word + if ($j === $pluralLength) { + break; + } + } + } + // Assume that plural and singular is identical + return [$plural]; + } + public function pluralize(string $singular) : array + { + $singularRev = \strrev($singular); + $lowerSingularRev = \strtolower($singularRev); + $singularLength = \strlen($lowerSingularRev); + // Check if the word is one which is not inflected, return early if so + if (\in_array($lowerSingularRev, self::UNINFLECTED, \true)) { + return [$singular]; + } + // The outer loop iterates over the entries of the singular table + // The inner loop $j iterates over the characters of the singular suffix + // in the singular table to compare them with the characters of the actual + // given singular suffix + foreach (self::SINGULAR_MAP as $map) { + $suffix = $map[0]; + $suffixLength = $map[1]; + $j = 0; + // Compare characters in the singular table and of the suffix of the + // given plural one by one + while ($suffix[$j] === $lowerSingularRev[$j]) { + // Let $j point to the next character + ++$j; + // Successfully compared the last character + // Add an entry with the plural suffix to the plural array + if ($j === $suffixLength) { + // Is there any character preceding the suffix in the plural string? + if ($j < $singularLength) { + $nextIsVowel = \strpos('aeiou', $lowerSingularRev[$j]) !== \false; + if (!$map[2] && $nextIsVowel) { + // suffix may not succeed a vowel but next char is one + break; + } + if (!$map[3] && !$nextIsVowel) { + // suffix may not succeed a consonant but next char is one + break; + } + } + $newBase = \substr($singular, 0, $singularLength - $suffixLength); + $newSuffix = $map[4]; + // Check whether the first character in the singular suffix + // is uppercased. If yes, uppercase the first character in + // the singular suffix too + $firstUpper = \ctype_upper($singularRev[$j - 1]); + if (\is_array($newSuffix)) { + $plurals = []; + foreach ($newSuffix as $newSuffixEntry) { + $plurals[] = $newBase . ($firstUpper ? \ucfirst($newSuffixEntry) : $newSuffixEntry); + } + return $plurals; + } + return [$newBase . ($firstUpper ? \ucfirst($newSuffix) : $newSuffix)]; + } + // Suffix is longer than word + if ($j === $singularLength) { + break; + } + } + } + // Assume that plural is singular with a trailing `s` + return [$singular . 's']; + } +} diff --git a/vendor/symfony/string/Inflector/FrenchInflector.php b/vendor/symfony/string/Inflector/FrenchInflector.php new file mode 100644 index 00000000..f20af6bf --- /dev/null +++ b/vendor/symfony/string/Inflector/FrenchInflector.php @@ -0,0 +1,122 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String\Inflector; + +/** + * French inflector. + * + * This class does only inflect nouns; not adjectives nor composed words like "soixante-dix". + */ +final class FrenchInflector implements InflectorInterface +{ + /** + * A list of all rules for pluralise. + * + * @see https://la-conjugaison.nouvelobs.com/regles/grammaire/le-pluriel-des-noms-121.php + */ + private const PLURALIZE_REGEXP = [ + // First entry: regexp + // Second entry: replacement + // Words finishing with "s", "x" or "z" are invariables + // Les mots finissant par "s", "x" ou "z" sont invariables + ['/(s|x|z)$/i', '\\1'], + // Words finishing with "eau" are pluralized with a "x" + // Les mots finissant par "eau" prennent tous un "x" au pluriel + ['/(eau)$/i', '\\1x'], + // Words finishing with "au" are pluralized with a "x" excepted "landau" + // Les mots finissant par "au" prennent un "x" au pluriel sauf "landau" + ['/^(landau)$/i', '\\1s'], + ['/(au)$/i', '\\1x'], + // Words finishing with "eu" are pluralized with a "x" excepted "pneu", "bleu", "émeu" + // Les mots finissant en "eu" prennent un "x" au pluriel sauf "pneu", "bleu", "émeu" + ['/^(pneu|bleu|émeu)$/i', '\\1s'], + ['/(eu)$/i', '\\1x'], + // Words finishing with "al" are pluralized with a "aux" excepted + // Les mots finissant en "al" se terminent en "aux" sauf + ['/^(bal|carnaval|caracal|chacal|choral|corral|étal|festival|récital|val)$/i', '\\1s'], + ['/al$/i', '\\1aux'], + // Aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail font leur pluriel en -aux + ['/^(aspir|b|cor|ém|ferm|soupir|trav|vant|vitr)ail$/i', '\\1aux'], + // Bijou, caillou, chou, genou, hibou, joujou et pou qui prennent un x au pluriel + ['/^(bij|caill|ch|gen|hib|jouj|p)ou$/i', '\\1oux'], + // Invariable words + ['/^(cinquante|soixante|mille)$/i', '\\1'], + // French titles + ['/^(mon|ma)(sieur|dame|demoiselle|seigneur)$/', 'RuleDocGenerator202403\\mes\\2s'], + ['/^(Mon|Ma)(sieur|dame|demoiselle|seigneur)$/', 'RuleDocGenerator202403\\Mes\\2s'], + ]; + /** + * A list of all rules for singularize. + */ + private const SINGULARIZE_REGEXP = [ + // First entry: regexp + // Second entry: replacement + // Aspirail, bail, corail, émail, fermail, soupirail, travail, vantail et vitrail font leur pluriel en -aux + ['/((aspir|b|cor|ém|ferm|soupir|trav|vant|vitr))aux$/i', '\\1ail'], + // Words finishing with "eau" are pluralized with a "x" + // Les mots finissant par "eau" prennent tous un "x" au pluriel + ['/(eau)x$/i', '\\1'], + // Words finishing with "al" are pluralized with a "aux" expected + // Les mots finissant en "al" se terminent en "aux" sauf + ['/(amir|anim|arsen|boc|can|capit|capor|chev|crist|génér|hopit|hôpit|idé|journ|littor|loc|m|mét|minér|princip|radic|termin)aux$/i', '\\1al'], + // Words finishing with "au" are pluralized with a "x" excepted "landau" + // Les mots finissant par "au" prennent un "x" au pluriel sauf "landau" + ['/(au)x$/i', '\\1'], + // Words finishing with "eu" are pluralized with a "x" excepted "pneu", "bleu", "émeu" + // Les mots finissant en "eu" prennent un "x" au pluriel sauf "pneu", "bleu", "émeu" + ['/(eu)x$/i', '\\1'], + // Words finishing with "ou" are pluralized with a "s" excepted bijou, caillou, chou, genou, hibou, joujou, pou + // Les mots finissant par "ou" prennent un "s" sauf bijou, caillou, chou, genou, hibou, joujou, pou + ['/(bij|caill|ch|gen|hib|jouj|p)oux$/i', '\\1ou'], + // French titles + ['/^mes(dame|demoiselle)s$/', 'RuleDocGenerator202403\\ma\\1'], + ['/^Mes(dame|demoiselle)s$/', 'RuleDocGenerator202403\\Ma\\1'], + ['/^mes(sieur|seigneur)s$/', 'RuleDocGenerator202403\\mon\\1'], + ['/^Mes(sieur|seigneur)s$/', 'RuleDocGenerator202403\\Mon\\1'], + // Default rule + ['/s$/i', ''], + ]; + /** + * A list of words which should not be inflected. + * This list is only used by singularize. + */ + private const UNINFLECTED = '/^(abcès|accès|abus|albatros|anchois|anglais|autobus|bois|brebis|carquois|cas|chas|colis|concours|corps|cours|cyprès|décès|devis|discours|dos|embarras|engrais|entrelacs|excès|fils|fois|gâchis|gars|glas|héros|intrus|jars|jus|kermès|lacis|legs|lilas|marais|mars|matelas|mépris|mets|mois|mors|obus|os|palais|paradis|parcours|pardessus|pays|plusieurs|poids|pois|pouls|printemps|processus|progrès|puits|pus|rabais|radis|recors|recours|refus|relais|remords|remous|rictus|rhinocéros|repas|rubis|sans|sas|secours|sens|souris|succès|talus|tapis|tas|taudis|temps|tiers|univers|velours|verglas|vernis|virus)$/i'; + public function singularize(string $plural) : array + { + if ($this->isInflectedWord($plural)) { + return [$plural]; + } + foreach (self::SINGULARIZE_REGEXP as $rule) { + [$regexp, $replace] = $rule; + if (1 === \preg_match($regexp, $plural)) { + return [\preg_replace($regexp, $replace, $plural)]; + } + } + return [$plural]; + } + public function pluralize(string $singular) : array + { + if ($this->isInflectedWord($singular)) { + return [$singular]; + } + foreach (self::PLURALIZE_REGEXP as $rule) { + [$regexp, $replace] = $rule; + if (1 === \preg_match($regexp, $singular)) { + return [\preg_replace($regexp, $replace, $singular)]; + } + } + return [$singular . 's']; + } + private function isInflectedWord(string $word) : bool + { + return 1 === \preg_match(self::UNINFLECTED, $word); + } +} diff --git a/vendor/symfony/string/Inflector/InflectorInterface.php b/vendor/symfony/string/Inflector/InflectorInterface.php new file mode 100644 index 00000000..e82b6f23 --- /dev/null +++ b/vendor/symfony/string/Inflector/InflectorInterface.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String\Inflector; + +interface InflectorInterface +{ + /** + * Returns the singular forms of a string. + * + * If the method can't determine the form with certainty, several possible singulars are returned. + * + * @return string[] + */ + public function singularize(string $plural) : array; + /** + * Returns the plural forms of a string. + * + * If the method can't determine the form with certainty, several possible plurals are returned. + * + * @return string[] + */ + public function pluralize(string $singular) : array; +} diff --git a/vendor/symfony/string/LICENSE b/vendor/symfony/string/LICENSE new file mode 100644 index 00000000..f37c76b5 --- /dev/null +++ b/vendor/symfony/string/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2019-present Fabien Potencier + +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/symfony/string/LazyString.php b/vendor/symfony/string/LazyString.php new file mode 100644 index 00000000..143fdda1 --- /dev/null +++ b/vendor/symfony/string/LazyString.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String; + +/** + * A string whose value is computed lazily by a callback. + * + * @author Nicolas Grekas + */ +class LazyString implements \JsonSerializable +{ + /** + * @var \Closure|string + */ + private $value; + /** + * @param callable|array $callback A callable or a [Closure, method] lazy-callable + * @param mixed ...$arguments + * @return static + */ + public static function fromCallable($callback, ...$arguments) + { + if (\is_array($callback) && !\is_callable($callback) && !(($callback[0] ?? null) instanceof \Closure || 2 < \count($callback))) { + throw new \TypeError(\sprintf('Argument 1 passed to "%s()" must be a callable or a [Closure, method] lazy-callable, "%s" given.', __METHOD__, '[' . \implode(', ', \array_map('get_debug_type', $callback)) . ']')); + } + $lazyString = new static(); + $lazyString->value = static function () use(&$callback, &$arguments) : string { + static $value; + if (null !== $arguments) { + if (!\is_callable($callback)) { + $callback[0] = $callback[0](); + $callback[1] = $callback[1] ?? '__invoke'; + } + $value = $callback(...$arguments); + $callback = !\is_scalar($value) && !$value instanceof \Stringable ? self::getPrettyName($callback) : 'callable'; + $arguments = null; + } + return $value ?? ''; + }; + return $lazyString; + } + /** + * @param string|int|float|bool|\Stringable $value + * @return static + */ + public static function fromStringable($value) + { + if (\is_object($value)) { + return static::fromCallable(\Closure::fromCallable([$value, '__toString'])); + } + $lazyString = new static(); + $lazyString->value = (string) $value; + return $lazyString; + } + /** + * Tells whether the provided value can be cast to string. + * @param mixed $value + */ + public static final function isStringable($value) : bool + { + return \is_string($value) || $value instanceof \Stringable || \is_scalar($value); + } + /** + * Casts scalars and stringable objects to strings. + * + * @throws \TypeError When the provided value is not stringable + * @param \Stringable|string|int|float|bool $value + */ + public static final function resolve($value) : string + { + return $value; + } + public function __toString() : string + { + if (\is_string($this->value)) { + return $this->value; + } + try { + return $this->value = ($this->value)(); + } catch (\Throwable $e) { + if (\TypeError::class === \get_class($e) && __FILE__ === $e->getFile()) { + $type = \explode(', ', $e->getMessage()); + $type = \substr(\array_pop($type), 0, -\strlen(' returned')); + $r = new \ReflectionFunction($this->value); + $callback = $r->getStaticVariables()['callback']; + $e = new \TypeError(\sprintf('Return value of %s() passed to %s::fromCallable() must be of the type string, %s returned.', $callback, static::class, $type)); + } + throw $e; + } + } + public function __sleep() : array + { + $this->__toString(); + return ['value']; + } + public function jsonSerialize() : string + { + return $this->__toString(); + } + private function __construct() + { + } + private static function getPrettyName(callable $callback) : string + { + if (\is_string($callback)) { + return $callback; + } + if (\is_array($callback)) { + $class = \is_object($callback[0]) ? \get_debug_type($callback[0]) : $callback[0]; + $method = $callback[1]; + } elseif ($callback instanceof \Closure) { + $r = new \ReflectionFunction($callback); + if (\strpos($r->name, '{closure}') !== \false || !($class = $r->getClosureCalledClass())) { + return $r->name; + } + $class = $class->name; + $method = $r->name; + } else { + $class = \get_debug_type($callback); + $method = '__invoke'; + } + return $class . '::' . $method; + } +} diff --git a/vendor/symfony/string/README.md b/vendor/symfony/string/README.md new file mode 100644 index 00000000..9c7e1e19 --- /dev/null +++ b/vendor/symfony/string/README.md @@ -0,0 +1,14 @@ +String Component +================ + +The String component provides an object-oriented API to strings and deals +with bytes, UTF-8 code points and grapheme clusters in a unified way. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/string.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/string/Resources/data/wcswidth_table_wide.php b/vendor/symfony/string/Resources/data/wcswidth_table_wide.php new file mode 100644 index 00000000..e5027bac --- /dev/null +++ b/vendor/symfony/string/Resources/data/wcswidth_table_wide.php @@ -0,0 +1,11 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String; + +if (!\function_exists(u::class)) { + function u(?string $string = '') : UnicodeString + { + return new UnicodeString($string ?? ''); + } +} +if (!\function_exists(b::class)) { + function b(?string $string = '') : ByteString + { + return new ByteString($string ?? ''); + } +} +if (!\function_exists(s::class)) { + /** + * @return UnicodeString|ByteString + */ + function s(?string $string = '') : AbstractString + { + $string = $string ?? ''; + return \preg_match('//u', $string) ? new UnicodeString($string) : new ByteString($string); + } +} diff --git a/vendor/symfony/string/Slugger/AsciiSlugger.php b/vendor/symfony/string/Slugger/AsciiSlugger.php new file mode 100644 index 00000000..4a36677c --- /dev/null +++ b/vendor/symfony/string/Slugger/AsciiSlugger.php @@ -0,0 +1,161 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String\Slugger; + +use RuleDocGenerator202403\Symfony\Component\Intl\Transliterator\EmojiTransliterator; +use RuleDocGenerator202403\Symfony\Component\String\AbstractUnicodeString; +use RuleDocGenerator202403\Symfony\Component\String\UnicodeString; +use RuleDocGenerator202403\Symfony\Contracts\Translation\LocaleAwareInterface; +if (!\interface_exists(LocaleAwareInterface::class)) { + throw new \LogicException('You cannot use the "Symfony\\Component\\String\\Slugger\\AsciiSlugger" as the "symfony/translation-contracts" package is not installed. Try running "composer require symfony/translation-contracts".'); +} +/** + * @author Titouan Galopin + */ +class AsciiSlugger implements SluggerInterface, LocaleAwareInterface +{ + private const LOCALE_TO_TRANSLITERATOR_ID = ['am' => 'Amharic-Latin', 'ar' => 'Arabic-Latin', 'az' => 'Azerbaijani-Latin', 'be' => 'Belarusian-Latin', 'bg' => 'Bulgarian-Latin', 'bn' => 'Bengali-Latin', 'de' => 'de-ASCII', 'el' => 'Greek-Latin', 'fa' => 'Persian-Latin', 'he' => 'Hebrew-Latin', 'hy' => 'Armenian-Latin', 'ka' => 'Georgian-Latin', 'kk' => 'Kazakh-Latin', 'ky' => 'Kirghiz-Latin', 'ko' => 'Korean-Latin', 'mk' => 'Macedonian-Latin', 'mn' => 'Mongolian-Latin', 'or' => 'Oriya-Latin', 'ps' => 'Pashto-Latin', 'ru' => 'Russian-Latin', 'sr' => 'Serbian-Latin', 'sr_Cyrl' => 'Serbian-Latin', 'th' => 'Thai-Latin', 'tk' => 'Turkmen-Latin', 'uk' => 'Ukrainian-Latin', 'uz' => 'Uzbek-Latin', 'zh' => 'Han-Latin']; + /** + * @var string|null + */ + private $defaultLocale; + /** + * @var \Closure|mixed[] + */ + private $symbolsMap = ['en' => ['@' => 'at', '&' => 'and']]; + /** + * @var bool|string + */ + private $emoji = \false; + /** + * Cache of transliterators per locale. + * + * @var \Transliterator[] + */ + private $transliterators = []; + /** + * @param mixed[]|\Closure|null $symbolsMap + */ + public function __construct(?string $defaultLocale = null, $symbolsMap = null) + { + $this->defaultLocale = $defaultLocale; + $this->symbolsMap = $symbolsMap ?? $this->symbolsMap; + } + public function setLocale(string $locale) : void + { + $this->defaultLocale = $locale; + } + public function getLocale() : string + { + return $this->defaultLocale; + } + /** + * @param bool|string $emoji true will use the same locale, + * false will disable emoji, + * and a string to use a specific locale + * @return static + */ + public function withEmoji($emoji = \true) + { + if (\false !== $emoji && !\class_exists(EmojiTransliterator::class)) { + throw new \LogicException(\sprintf('You cannot use the "%s()" method as the "symfony/intl" package is not installed. Try running "composer require symfony/intl".', __METHOD__)); + } + $new = clone $this; + $new->emoji = $emoji; + return $new; + } + public function slug(string $string, string $separator = '-', ?string $locale = null) : AbstractUnicodeString + { + $locale = $locale ?? $this->defaultLocale; + $transliterator = []; + if ($locale && ('de' === $locale || \strncmp($locale, 'de_', \strlen('de_')) === 0)) { + // Use the shortcut for German in UnicodeString::ascii() if possible (faster and no requirement on intl) + $transliterator = ['de-ASCII']; + } elseif (\function_exists('transliterator_transliterate') && $locale) { + $transliterator = (array) $this->createTransliterator($locale); + } + if ($emojiTransliterator = $this->createEmojiTransliterator($locale)) { + $transliterator[] = $emojiTransliterator; + } + if ($this->symbolsMap instanceof \Closure) { + // If the symbols map is passed as a closure, there is no need to fallback to the parent locale + // as the closure can just provide substitutions for all locales of interest. + $symbolsMap = $this->symbolsMap; + \array_unshift($transliterator, static function ($s) use($symbolsMap, $locale) { + return $symbolsMap($s, $locale); + }); + } + $unicodeString = (new UnicodeString($string))->ascii($transliterator); + if (\is_array($this->symbolsMap)) { + $map = null; + if (isset($this->symbolsMap[$locale])) { + $map = $this->symbolsMap[$locale]; + } else { + $parent = self::getParentLocale($locale); + if ($parent && isset($this->symbolsMap[$parent])) { + $map = $this->symbolsMap[$parent]; + } + } + if ($map) { + foreach ($map as $char => $replace) { + $unicodeString = $unicodeString->replace($char, ' ' . $replace . ' '); + } + } + } + return $unicodeString->replaceMatches('/[^A-Za-z0-9]++/', $separator)->trim($separator); + } + private function createTransliterator(string $locale) : ?\Transliterator + { + if (\array_key_exists($locale, $this->transliterators)) { + return $this->transliterators[$locale]; + } + // Exact locale supported, cache and return + if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$locale] ?? null) { + return $this->transliterators[$locale] = \Transliterator::create($id . '/BGN') ?? \Transliterator::create($id); + } + // Locale not supported and no parent, fallback to any-latin + if (!($parent = self::getParentLocale($locale))) { + return $this->transliterators[$locale] = null; + } + // Try to use the parent locale (ie. try "de" for "de_AT") and cache both locales + if ($id = self::LOCALE_TO_TRANSLITERATOR_ID[$parent] ?? null) { + $transliterator = \Transliterator::create($id . '/BGN') ?? \Transliterator::create($id); + } + return $this->transliterators[$locale] = $this->transliterators[$parent] = $transliterator ?? null; + } + private function createEmojiTransliterator(?string $locale) : ?EmojiTransliterator + { + if (\is_string($this->emoji)) { + $locale = $this->emoji; + } elseif (!$this->emoji) { + return null; + } + while (null !== $locale) { + try { + return EmojiTransliterator::create("emoji-{$locale}"); + } catch (\IntlException $exception) { + $locale = self::getParentLocale($locale); + } + } + return null; + } + private static function getParentLocale(?string $locale) : ?string + { + if (!$locale) { + return null; + } + if (\false === ($str = \strrchr($locale, '_'))) { + // no parent locale + return null; + } + return \substr($locale, 0, -\strlen($str)); + } +} diff --git a/vendor/symfony/string/Slugger/SluggerInterface.php b/vendor/symfony/string/Slugger/SluggerInterface.php new file mode 100644 index 00000000..fad1835b --- /dev/null +++ b/vendor/symfony/string/Slugger/SluggerInterface.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String\Slugger; + +use RuleDocGenerator202403\Symfony\Component\String\AbstractUnicodeString; +/** + * Creates a URL-friendly slug from a given string. + * + * @author Titouan Galopin + */ +interface SluggerInterface +{ + /** + * Creates a slug for the given string and locale, using appropriate transliteration when needed. + */ + public function slug(string $string, string $separator = '-', ?string $locale = null) : AbstractUnicodeString; +} diff --git a/vendor/symfony/string/UnicodeString.php b/vendor/symfony/string/UnicodeString.php new file mode 100644 index 00000000..78efea4c --- /dev/null +++ b/vendor/symfony/string/UnicodeString.php @@ -0,0 +1,338 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\String; + +use RuleDocGenerator202403\Symfony\Component\String\Exception\ExceptionInterface; +use RuleDocGenerator202403\Symfony\Component\String\Exception\InvalidArgumentException; +/** + * Represents a string of Unicode grapheme clusters encoded as UTF-8. + * + * A letter followed by combining characters (accents typically) form what Unicode defines + * as a grapheme cluster: a character as humans mean it in written texts. This class knows + * about the concept and won't split a letter apart from its combining accents. It also + * ensures all string comparisons happen on their canonically-composed representation, + * ignoring e.g. the order in which accents are listed when a letter has many of them. + * + * @see https://unicode.org/reports/tr15/ + * + * @author Nicolas Grekas + * @author Hugo Hamon + * + * @throws ExceptionInterface + */ +class UnicodeString extends AbstractUnicodeString +{ + public function __construct(string $string = '') + { + if ('' === $string || \normalizer_is_normalized($this->string = $string)) { + return; + } + if (\false === ($string = \normalizer_normalize($string))) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + $this->string = $string; + } + /** + * @return static + */ + public function append(string ...$suffix) + { + $str = clone $this; + $str->string = $this->string . (1 >= \count($suffix) ? $suffix[0] ?? '' : \implode('', $suffix)); + if (\normalizer_is_normalized($str->string)) { + return $str; + } + if (\false === ($string = \normalizer_normalize($str->string))) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + $str->string = $string; + return $str; + } + public function chunk(int $length = 1) : array + { + if (1 > $length) { + throw new InvalidArgumentException('The chunk length must be greater than zero.'); + } + if ('' === $this->string) { + return []; + } + $rx = '/('; + while (65535 < $length) { + $rx .= '\\X{65535}'; + $length -= 65535; + } + $rx .= '\\X{' . $length . '})/u'; + $str = clone $this; + $chunks = []; + foreach (\preg_split($rx, $this->string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY) as $chunk) { + $str->string = $chunk; + $chunks[] = clone $str; + } + return $chunks; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $suffix + */ + public function endsWith($suffix) : bool + { + if ($suffix instanceof AbstractString) { + $suffix = $suffix->string; + } elseif (!\is_string($suffix)) { + return parent::endsWith($suffix); + } + $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; + \normalizer_is_normalized($suffix, $form) ?: ($suffix = \normalizer_normalize($suffix, $form)); + if ('' === $suffix || \false === $suffix) { + return \false; + } + if ($this->ignoreCase) { + return 0 === \mb_stripos(\grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)), $suffix, 0, 'UTF-8'); + } + return $suffix === \grapheme_extract($this->string, \strlen($suffix), \GRAPHEME_EXTR_MAXBYTES, \strlen($this->string) - \strlen($suffix)); + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $string + */ + public function equalsTo($string) : bool + { + if ($string instanceof AbstractString) { + $string = $string->string; + } elseif (!\is_string($string)) { + return parent::equalsTo($string); + } + $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; + \normalizer_is_normalized($string, $form) ?: ($string = \normalizer_normalize($string, $form)); + if ('' !== $string && \false !== $string && $this->ignoreCase) { + return \strlen($string) === \strlen($this->string) && 0 === \mb_stripos($this->string, $string, 0, 'UTF-8'); + } + return $string === $this->string; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $needle + */ + public function indexOf($needle, int $offset = 0) : ?int + { + if ($needle instanceof AbstractString) { + $needle = $needle->string; + } elseif (!\is_string($needle)) { + return parent::indexOf($needle, $offset); + } + $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; + \normalizer_is_normalized($needle, $form) ?: ($needle = \normalizer_normalize($needle, $form)); + if ('' === $needle || \false === $needle) { + return null; + } + try { + $i = $this->ignoreCase ? \grapheme_stripos($this->string, $needle, $offset) : \grapheme_strpos($this->string, $needle, $offset); + } catch (\ValueError $exception) { + return null; + } + return \false === $i ? null : $i; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $needle + */ + public function indexOfLast($needle, int $offset = 0) : ?int + { + if ($needle instanceof AbstractString) { + $needle = $needle->string; + } elseif (!\is_string($needle)) { + return parent::indexOfLast($needle, $offset); + } + $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; + \normalizer_is_normalized($needle, $form) ?: ($needle = \normalizer_normalize($needle, $form)); + if ('' === $needle || \false === $needle) { + return null; + } + $string = $this->string; + if (0 > $offset) { + // workaround https://bugs.php.net/74264 + if (0 > ($offset += \grapheme_strlen($needle))) { + $string = \grapheme_substr($string, 0, $offset); + } + $offset = 0; + } + $i = $this->ignoreCase ? \grapheme_strripos($string, $needle, $offset) : \grapheme_strrpos($string, $needle, $offset); + return \false === $i ? null : $i; + } + /** + * @return static + */ + public function join(array $strings, ?string $lastGlue = null) + { + $str = parent::join($strings, $lastGlue); + \normalizer_is_normalized($str->string) ?: ($str->string = \normalizer_normalize($str->string)); + return $str; + } + public function length() : int + { + return \grapheme_strlen($this->string); + } + /** + * @return static + */ + public function normalize(int $form = self::NFC) + { + $str = clone $this; + if (\in_array($form, [self::NFC, self::NFKC], \true)) { + \normalizer_is_normalized($str->string, $form) ?: ($str->string = \normalizer_normalize($str->string, $form)); + } elseif (!\in_array($form, [self::NFD, self::NFKD], \true)) { + throw new InvalidArgumentException('Unsupported normalization form.'); + } elseif (!\normalizer_is_normalized($str->string, $form)) { + $str->string = \normalizer_normalize($str->string, $form); + $str->ignoreCase = null; + } + return $str; + } + /** + * @return static + */ + public function prepend(string ...$prefix) + { + $str = clone $this; + $str->string = (1 >= \count($prefix) ? $prefix[0] ?? '' : \implode('', $prefix)) . $this->string; + if (\normalizer_is_normalized($str->string)) { + return $str; + } + if (\false === ($string = \normalizer_normalize($str->string))) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + $str->string = $string; + return $str; + } + /** + * @return static + */ + public function replace(string $from, string $to) + { + $str = clone $this; + \normalizer_is_normalized($from) ?: ($from = \normalizer_normalize($from)); + if ('' !== $from && \false !== $from) { + $tail = $str->string; + $result = ''; + $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos'; + while ('' !== $tail && \false !== ($i = $indexOf($tail, $from))) { + $slice = \grapheme_substr($tail, 0, $i); + $result .= $slice . $to; + $tail = \substr($tail, \strlen($slice) + \strlen($from)); + } + $str->string = $result . $tail; + if (\normalizer_is_normalized($str->string)) { + return $str; + } + if (\false === ($string = \normalizer_normalize($str->string))) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + $str->string = $string; + } + return $str; + } + /** + * @param string|callable $to + * @return static + */ + public function replaceMatches(string $fromRegexp, $to) + { + $str = parent::replaceMatches($fromRegexp, $to); + \normalizer_is_normalized($str->string) ?: ($str->string = \normalizer_normalize($str->string)); + return $str; + } + /** + * @return static + */ + public function slice(int $start = 0, ?int $length = null) + { + $str = clone $this; + $str->string = (string) \grapheme_substr($this->string, $start, $length ?? 2147483647); + return $str; + } + /** + * @return static + */ + public function splice(string $replacement, int $start = 0, ?int $length = null) + { + $str = clone $this; + $start = $start ? \strlen(\grapheme_substr($this->string, 0, $start)) : 0; + $length = $length ? \strlen(\grapheme_substr($this->string, $start, $length ?? 2147483647)) : $length; + $str->string = \substr_replace($this->string, $replacement, $start, $length ?? 2147483647); + if (\normalizer_is_normalized($str->string)) { + return $str; + } + if (\false === ($string = \normalizer_normalize($str->string))) { + throw new InvalidArgumentException('Invalid UTF-8 string.'); + } + $str->string = $string; + return $str; + } + public function split(string $delimiter, ?int $limit = null, ?int $flags = null) : array + { + if (1 > ($limit = $limit ?? 2147483647)) { + throw new InvalidArgumentException('Split limit must be a positive integer.'); + } + if ('' === $delimiter) { + throw new InvalidArgumentException('Split delimiter is empty.'); + } + if (null !== $flags) { + return parent::split($delimiter . 'u', $limit, $flags); + } + \normalizer_is_normalized($delimiter) ?: ($delimiter = \normalizer_normalize($delimiter)); + if (\false === $delimiter) { + throw new InvalidArgumentException('Split delimiter is not a valid UTF-8 string.'); + } + $str = clone $this; + $tail = $this->string; + $chunks = []; + $indexOf = $this->ignoreCase ? 'grapheme_stripos' : 'grapheme_strpos'; + while (1 < $limit && \false !== ($i = $indexOf($tail, $delimiter))) { + $str->string = \grapheme_substr($tail, 0, $i); + $chunks[] = clone $str; + $tail = \substr($tail, \strlen($str->string) + \strlen($delimiter)); + --$limit; + } + $str->string = $tail; + $chunks[] = clone $str; + return $chunks; + } + /** + * @param string|iterable|\Symfony\Component\String\AbstractString $prefix + */ + public function startsWith($prefix) : bool + { + if ($prefix instanceof AbstractString) { + $prefix = $prefix->string; + } elseif (!\is_string($prefix)) { + return parent::startsWith($prefix); + } + $form = null === $this->ignoreCase ? \Normalizer::NFD : \Normalizer::NFC; + \normalizer_is_normalized($prefix, $form) ?: ($prefix = \normalizer_normalize($prefix, $form)); + if ('' === $prefix || \false === $prefix) { + return \false; + } + if ($this->ignoreCase) { + return 0 === \mb_stripos(\grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES), $prefix, 0, 'UTF-8'); + } + return $prefix === \grapheme_extract($this->string, \strlen($prefix), \GRAPHEME_EXTR_MAXBYTES); + } + public function __wakeup() : void + { + if (!\is_string($this->string)) { + throw new \BadMethodCallException('Cannot unserialize ' . __CLASS__); + } + \normalizer_is_normalized($this->string) ?: ($this->string = \normalizer_normalize($this->string)); + } + public function __clone() + { + if (null === $this->ignoreCase) { + \normalizer_is_normalized($this->string) ?: ($this->string = \normalizer_normalize($this->string)); + } + $this->ignoreCase = \false; + } +} diff --git a/vendor/symfony/string/composer.json b/vendor/symfony/string/composer.json new file mode 100644 index 00000000..eaca7269 --- /dev/null +++ b/vendor/symfony/string/composer.json @@ -0,0 +1,54 @@ +{ + "name": "symfony\/string", + "type": "library", + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "keywords": [ + "string", + "utf8", + "utf-8", + "grapheme", + "i18n", + "unicode" + ], + "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.2", + "symfony\/polyfill-ctype": "~1.8", + "symfony\/polyfill-intl-grapheme": "~1.0", + "symfony\/polyfill-intl-normalizer": "~1.0", + "symfony\/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "symfony\/error-handler": "^6.4|^7.0", + "symfony\/intl": "^6.4|^7.0", + "symfony\/http-client": "^6.4|^7.0", + "symfony\/translation-contracts": "^2.5|^3.0", + "symfony\/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "symfony\/translation-contracts": "<2.5" + }, + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources\/functions.php" + ], + "exclude-from-classmap": [ + "\/Tests\/" + ] + }, + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/vendor/symfony/yaml/CHANGELOG.md b/vendor/symfony/yaml/CHANGELOG.md new file mode 100644 index 00000000..0c2021f4 --- /dev/null +++ b/vendor/symfony/yaml/CHANGELOG.md @@ -0,0 +1,253 @@ +CHANGELOG +========= + +6.3 +--- + + * Add support to dump int keys as strings by using the `Yaml::DUMP_NUMERIC_KEY_AS_STRING` flag + +6.2 +--- + + * Add support for `!php/enum` and `!php/enum *->value` + * Deprecate the `!php/const:` tag in key which will be replaced by the `!php/const` tag (without the colon) since 3.4 + +6.1 +--- + + * In cases where it will likely improve readability, strings containing single quotes will be double-quoted + +5.4 +--- + + * Add new `lint:yaml dirname --exclude=/dirname/foo.yaml --exclude=/dirname/bar.yaml` + option to exclude one or more specific files from multiple file list + * Allow negatable for the parse tags option with `--no-parse-tags` + +5.3 +--- + + * Added `github` format support & autodetection to render errors as annotations + when running the YAML linter command in a Github Action environment. + +5.1.0 +----- + + * Added support for parsing numbers prefixed with `0o` as octal numbers. + * Deprecated support for parsing numbers starting with `0` as octal numbers. They will be parsed as strings as of Symfony 6.0. Prefix numbers with `0o` + so that they are parsed as octal numbers. + + Before: + + ```yaml + Yaml::parse('072'); + ``` + + After: + + ```yaml + Yaml::parse('0o72'); + ``` + + * Added `yaml-lint` binary. + * Deprecated using the `!php/object` and `!php/const` tags without a value. + +5.0.0 +----- + + * Removed support for mappings inside multi-line strings. + * removed support for implicit STDIN usage in the `lint:yaml` command, use `lint:yaml -` (append a dash) instead to make it explicit. + +4.4.0 +----- + + * Added support for parsing the inline notation spanning multiple lines. + * Added support to dump `null` as `~` by using the `Yaml::DUMP_NULL_AS_TILDE` flag. + * deprecated accepting STDIN implicitly when using the `lint:yaml` command, use `lint:yaml -` (append a dash) instead to make it explicit. + +4.3.0 +----- + + * Using a mapping inside a multi-line string is deprecated and will throw a `ParseException` in 5.0. + +4.2.0 +----- + + * added support for multiple files or directories in `LintCommand` + +4.0.0 +----- + + * The behavior of the non-specific tag `!` is changed and now forces + non-evaluating your values. + * complex mappings will throw a `ParseException` + * support for the comma as a group separator for floats has been dropped, use + the underscore instead + * support for the `!!php/object` tag has been dropped, use the `!php/object` + tag instead + * duplicate mapping keys throw a `ParseException` + * non-string mapping keys throw a `ParseException`, use the `Yaml::PARSE_KEYS_AS_STRINGS` + flag to cast them to strings + * `%` at the beginning of an unquoted string throw a `ParseException` + * mappings with a colon (`:`) that is not followed by a whitespace throw a + `ParseException` + * the `Dumper::setIndentation()` method has been removed + * being able to pass boolean options to the `Yaml::parse()`, `Yaml::dump()`, + `Parser::parse()`, and `Dumper::dump()` methods to configure the behavior of + the parser and dumper is no longer supported, pass bitmask flags instead + * the constructor arguments of the `Parser` class have been removed + * the `Inline` class is internal and no longer part of the BC promise + * removed support for the `!str` tag, use the `!!str` tag instead + * added support for tagged scalars. + + ```yml + Yaml::parse('!foo bar', Yaml::PARSE_CUSTOM_TAGS); + // returns TaggedValue('foo', 'bar'); + ``` + +3.4.0 +----- + + * added support for parsing YAML files using the `Yaml::parseFile()` or `Parser::parseFile()` method + + * the `Dumper`, `Parser`, and `Yaml` classes are marked as final + + * Deprecated the `!php/object:` tag which will be replaced by the + `!php/object` tag (without the colon) in 4.0. + + * Deprecated the `!php/const:` tag which will be replaced by the + `!php/const` tag (without the colon) in 4.0. + + * Support for the `!str` tag is deprecated, use the `!!str` tag instead. + + * Deprecated using the non-specific tag `!` as its behavior will change in 4.0. + It will force non-evaluating your values in 4.0. Use plain integers or `!!float` instead. + +3.3.0 +----- + + * Starting an unquoted string with a question mark followed by a space is + deprecated and will throw a `ParseException` in Symfony 4.0. + + * Deprecated support for implicitly parsing non-string mapping keys as strings. + Mapping keys that are no strings will lead to a `ParseException` in Symfony + 4.0. Use quotes to opt-in for keys to be parsed as strings. + + Before: + + ```php + $yaml = << new A(), 'bar' => 1], 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE | Yaml::DUMP_OBJECT); + ``` + +3.0.0 +----- + + * Yaml::parse() now throws an exception when a blackslash is not escaped + in double-quoted strings + +2.8.0 +----- + + * Deprecated usage of a colon in an unquoted mapping value + * Deprecated usage of @, \`, | and > at the beginning of an unquoted string + * When surrounding strings with double-quotes, you must now escape `\` characters. Not + escaping those characters (when surrounded by double-quotes) is deprecated. + + Before: + + ```yml + class: "Foo\Var" + ``` + + After: + + ```yml + class: "Foo\\Var" + ``` + +2.1.0 +----- + + * Yaml::parse() does not evaluate loaded files as PHP files by default + anymore (call Yaml::enablePhpParsing() to get back the old behavior) diff --git a/vendor/symfony/yaml/Command/LintCommand.php b/vendor/symfony/yaml/Command/LintCommand.php new file mode 100644 index 00000000..dad916c4 --- /dev/null +++ b/vendor/symfony/yaml/Command/LintCommand.php @@ -0,0 +1,243 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml\Command; + +use RuleDocGenerator202403\Symfony\Component\Console\Attribute\AsCommand; +use RuleDocGenerator202403\Symfony\Component\Console\CI\GithubActionReporter; +use RuleDocGenerator202403\Symfony\Component\Console\Command\Command; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionInput; +use RuleDocGenerator202403\Symfony\Component\Console\Completion\CompletionSuggestions; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\InvalidArgumentException; +use RuleDocGenerator202403\Symfony\Component\Console\Exception\RuntimeException; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputArgument; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Input\InputOption; +use RuleDocGenerator202403\Symfony\Component\Console\Output\OutputInterface; +use RuleDocGenerator202403\Symfony\Component\Console\Style\SymfonyStyle; +use RuleDocGenerator202403\Symfony\Component\Yaml\Exception\ParseException; +use RuleDocGenerator202403\Symfony\Component\Yaml\Parser; +use RuleDocGenerator202403\Symfony\Component\Yaml\Yaml; +/** + * Validates YAML files syntax and outputs encountered errors. + * + * @author Grégoire Pineau + * @author Robin Chalas + */ +class LintCommand extends Command +{ + /** + * @var \Symfony\Component\Yaml\Parser + */ + private $parser; + /** + * @var string|null + */ + private $format; + /** + * @var bool + */ + private $displayCorrectFiles; + /** + * @var \Closure|null + */ + private $directoryIteratorProvider; + /** + * @var \Closure|null + */ + private $isReadableProvider; + public function __construct(?string $name = null, ?callable $directoryIteratorProvider = null, ?callable $isReadableProvider = null) + { + parent::__construct($name); + $this->directoryIteratorProvider = null === $directoryIteratorProvider ? null : \Closure::fromCallable($directoryIteratorProvider); + $this->isReadableProvider = null === $isReadableProvider ? null : \Closure::fromCallable($isReadableProvider); + } + /** + * @return void + */ + protected function configure() + { + $this->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN')->addOption('format', null, InputOption::VALUE_REQUIRED, \sprintf('The output format ("%s")', \implode('", "', $this->getAvailableFormatOptions())))->addOption('exclude', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Path(s) to exclude')->addOption('parse-tags', null, InputOption::VALUE_NEGATABLE, 'Parse custom tags', null)->setHelp(<<%command.name% command lints a YAML file and outputs to STDOUT +the first encountered syntax error. + +You can validates YAML contents passed from STDIN: + + cat filename | php %command.full_name% - + +You can also validate the syntax of a file: + + php %command.full_name% filename + +Or of a whole directory: + + php %command.full_name% dirname + php %command.full_name% dirname --format=json + +You can also exclude one or more specific files: + + php %command.full_name% dirname --exclude="dirname/foo.yaml" --exclude="dirname/bar.yaml" + +EOF +); + } + protected function execute(InputInterface $input, OutputInterface $output) : int + { + $io = new SymfonyStyle($input, $output); + $filenames = (array) $input->getArgument('filename'); + $excludes = $input->getOption('exclude'); + $this->format = $input->getOption('format'); + $flags = $input->getOption('parse-tags'); + if (null === $this->format) { + // Autodetect format according to CI environment + $this->format = \class_exists(GithubActionReporter::class) && GithubActionReporter::isGithubActionEnvironment() ? 'github' : 'txt'; + } + $flags = $flags ? Yaml::PARSE_CUSTOM_TAGS : 0; + $this->displayCorrectFiles = $output->isVerbose(); + if (['-'] === $filenames) { + return $this->display($io, [$this->validate(\file_get_contents('php://stdin'), $flags)]); + } + if (!$filenames) { + throw new RuntimeException('Please provide a filename or pipe file content to STDIN.'); + } + $filesInfo = []; + foreach ($filenames as $filename) { + if (!$this->isReadable($filename)) { + throw new RuntimeException(\sprintf('File or directory "%s" is not readable.', $filename)); + } + foreach ($this->getFiles($filename) as $file) { + if (!\in_array($file->getPathname(), $excludes, \true)) { + $filesInfo[] = $this->validate(\file_get_contents($file), $flags, $file); + } + } + } + return $this->display($io, $filesInfo); + } + private function validate(string $content, int $flags, ?string $file = null) : array + { + $prevErrorHandler = \set_error_handler(function ($level, $message, $file, $line) use(&$prevErrorHandler) { + if (\E_USER_DEPRECATED === $level) { + throw new ParseException($message, $this->getParser()->getRealCurrentLineNb() + 1); + } + return $prevErrorHandler ? $prevErrorHandler($level, $message, $file, $line) : \false; + }); + try { + $this->getParser()->parse($content, Yaml::PARSE_CONSTANT | $flags); + } catch (ParseException $e) { + return ['file' => $file, 'line' => $e->getParsedLine(), 'valid' => \false, 'message' => $e->getMessage()]; + } finally { + \restore_error_handler(); + } + return ['file' => $file, 'valid' => \true]; + } + private function display(SymfonyStyle $io, array $files) : int + { + switch ($this->format) { + case 'txt': + return $this->displayTxt($io, $files); + case 'json': + return $this->displayJson($io, $files); + case 'github': + return $this->displayTxt($io, $files, \true); + default: + throw new InvalidArgumentException(\sprintf('Supported formats are "%s".', \implode('", "', $this->getAvailableFormatOptions()))); + } + } + private function displayTxt(SymfonyStyle $io, array $filesInfo, bool $errorAsGithubAnnotations = \false) : int + { + $countFiles = \count($filesInfo); + $erroredFiles = 0; + $suggestTagOption = \false; + if ($errorAsGithubAnnotations) { + $githubReporter = new GithubActionReporter($io); + } + foreach ($filesInfo as $info) { + if ($info['valid'] && $this->displayCorrectFiles) { + $io->comment('OK' . ($info['file'] ? \sprintf(' in %s', $info['file']) : '')); + } elseif (!$info['valid']) { + ++$erroredFiles; + $io->text(' ERROR ' . ($info['file'] ? \sprintf(' in %s', $info['file']) : '')); + $io->text(\sprintf(' >> %s', $info['message'])); + if (\strpos($info['message'], 'PARSE_CUSTOM_TAGS') !== \false) { + $suggestTagOption = \true; + } + if ($errorAsGithubAnnotations) { + $githubReporter->error($info['message'], $info['file'] ?? 'php://stdin', $info['line']); + } + } + } + if (0 === $erroredFiles) { + $io->success(\sprintf('All %d YAML files contain valid syntax.', $countFiles)); + } else { + $io->warning(\sprintf('%d YAML files have valid syntax and %d contain errors.%s', $countFiles - $erroredFiles, $erroredFiles, $suggestTagOption ? ' Use the --parse-tags option if you want parse custom tags.' : '')); + } + return \min($erroredFiles, 1); + } + private function displayJson(SymfonyStyle $io, array $filesInfo) : int + { + $errors = 0; + \array_walk($filesInfo, function (&$v) use(&$errors) { + $v['file'] = (string) $v['file']; + if (!$v['valid']) { + ++$errors; + } + if (isset($v['message']) && \strpos($v['message'], 'PARSE_CUSTOM_TAGS') !== \false) { + $v['message'] .= ' Use the --parse-tags option if you want parse custom tags.'; + } + }); + $io->writeln(\json_encode($filesInfo, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES)); + return \min($errors, 1); + } + private function getFiles(string $fileOrDirectory) : iterable + { + if (\is_file($fileOrDirectory)) { + (yield new \SplFileInfo($fileOrDirectory)); + return; + } + foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) { + if (!\in_array($file->getExtension(), ['yml', 'yaml'])) { + continue; + } + (yield $file); + } + } + private function getParser() : Parser + { + return $this->parser = $this->parser ?? new Parser(); + } + private function getDirectoryIterator(string $directory) : iterable + { + $default = function ($directory) { + return new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), \RecursiveIteratorIterator::LEAVES_ONLY); + }; + if (null !== $this->directoryIteratorProvider) { + return ($this->directoryIteratorProvider)($directory, $default); + } + return $default($directory); + } + private function isReadable(string $fileOrDirectory) : bool + { + $default = \Closure::fromCallable('is_readable'); + if (null !== $this->isReadableProvider) { + return ($this->isReadableProvider)($fileOrDirectory, $default); + } + return $default($fileOrDirectory); + } + public function complete(CompletionInput $input, CompletionSuggestions $suggestions) : void + { + if ($input->mustSuggestOptionValuesFor('format')) { + $suggestions->suggestValues($this->getAvailableFormatOptions()); + } + } + private function getAvailableFormatOptions() : array + { + return ['txt', 'json', 'github']; + } +} diff --git a/vendor/symfony/yaml/Dumper.php b/vendor/symfony/yaml/Dumper.php new file mode 100644 index 00000000..cec24099 --- /dev/null +++ b/vendor/symfony/yaml/Dumper.php @@ -0,0 +1,140 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml; + +use RuleDocGenerator202403\Symfony\Component\Yaml\Tag\TaggedValue; +/** + * Dumper dumps PHP variables to YAML strings. + * + * @author Fabien Potencier + * + * @final + */ +class Dumper +{ + /** + * The amount of spaces to use for indentation of nested nodes. + * @var int + */ + private $indentation; + public function __construct(int $indentation = 4) + { + if ($indentation < 1) { + throw new \InvalidArgumentException('The indentation must be greater than zero.'); + } + $this->indentation = $indentation; + } + /** + * Dumps a PHP value to YAML. + * + * @param mixed $input The PHP value + * @param int $inline The level where you switch to inline YAML + * @param int $indent The level of indentation (used internally) + * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + */ + public function dump($input, int $inline = 0, int $indent = 0, int $flags = 0) : string + { + $output = ''; + $prefix = $indent ? \str_repeat(' ', $indent) : ''; + $dumpObjectAsInlineMap = \true; + if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($input instanceof \ArrayObject || $input instanceof \stdClass)) { + $dumpObjectAsInlineMap = empty((array) $input); + } + if ($inline <= 0 || !\is_array($input) && !$input instanceof TaggedValue && $dumpObjectAsInlineMap || empty($input)) { + $output .= $prefix . Inline::dump($input, $flags); + } elseif ($input instanceof TaggedValue) { + $output .= $this->dumpTaggedValue($input, $inline, $indent, $flags, $prefix); + } else { + $dumpAsMap = Inline::isHash($input); + foreach ($input as $key => $value) { + if ('' !== $output && "\n" !== $output[-1]) { + $output .= "\n"; + } + if (\is_int($key) && Yaml::DUMP_NUMERIC_KEY_AS_STRING & $flags) { + $key = (string) $key; + } + if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value) && \strpos($value, "\n") !== \false && \strpos($value, "\r") === \false) { + $blockIndentationIndicator = $this->getBlockIndentationIndicator($value); + if (isset($value[-2]) && "\n" === $value[-2] && "\n" === $value[-1]) { + $blockChompingIndicator = '+'; + } elseif ("\n" === $value[-1]) { + $blockChompingIndicator = ''; + } else { + $blockChompingIndicator = '-'; + } + $output .= \sprintf('%s%s%s |%s%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags) . ':' : '-', '', $blockIndentationIndicator, $blockChompingIndicator); + foreach (\explode("\n", $value) as $row) { + if ('' === $row) { + $output .= "\n"; + } else { + $output .= \sprintf("\n%s%s%s", $prefix, \str_repeat(' ', $this->indentation), $row); + } + } + continue; + } + if ($value instanceof TaggedValue) { + $output .= \sprintf('%s%s !%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags) . ':' : '-', $value->getTag()); + if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value->getValue()) && \strpos($value->getValue(), "\n") !== \false && \strpos($value->getValue(), "\r\n") === \false) { + $blockIndentationIndicator = $this->getBlockIndentationIndicator($value->getValue()); + $output .= \sprintf(' |%s', $blockIndentationIndicator); + foreach (\explode("\n", $value->getValue()) as $row) { + $output .= \sprintf("\n%s%s%s", $prefix, \str_repeat(' ', $this->indentation), $row); + } + continue; + } + if ($inline - 1 <= 0 || null === $value->getValue() || \is_scalar($value->getValue())) { + $output .= ' ' . $this->dump($value->getValue(), $inline - 1, 0, $flags) . "\n"; + } else { + $output .= "\n"; + $output .= $this->dump($value->getValue(), $inline - 1, $dumpAsMap ? $indent + $this->indentation : $indent + 2, $flags); + } + continue; + } + $dumpObjectAsInlineMap = \true; + if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \ArrayObject || $value instanceof \stdClass)) { + $dumpObjectAsInlineMap = empty((array) $value); + } + $willBeInlined = $inline - 1 <= 0 || !\is_array($value) && $dumpObjectAsInlineMap || empty($value); + $output .= \sprintf('%s%s%s%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags) . ':' : '-', $willBeInlined ? ' ' : "\n", $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $flags)) . ($willBeInlined ? "\n" : ''); + } + } + return $output; + } + private function dumpTaggedValue(TaggedValue $value, int $inline, int $indent, int $flags, string $prefix) : string + { + $output = \sprintf('%s!%s', $prefix ? $prefix . ' ' : '', $value->getTag()); + if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value->getValue()) && \strpos($value->getValue(), "\n") !== \false && \strpos($value->getValue(), "\r\n") === \false) { + $blockIndentationIndicator = $this->getBlockIndentationIndicator($value->getValue()); + $output .= \sprintf(' |%s', $blockIndentationIndicator); + foreach (\explode("\n", $value->getValue()) as $row) { + $output .= \sprintf("\n%s%s%s", $prefix, \str_repeat(' ', $this->indentation), $row); + } + return $output; + } + if ($inline - 1 <= 0 || null === $value->getValue() || \is_scalar($value->getValue())) { + return $output . ' ' . $this->dump($value->getValue(), $inline - 1, 0, $flags) . "\n"; + } + return $output . "\n" . $this->dump($value->getValue(), $inline - 1, $indent, $flags); + } + private function getBlockIndentationIndicator(string $value) : string + { + $lines = \explode("\n", $value); + // If the first line (that is neither empty nor contains only spaces) + // starts with a space character, the spec requires a block indentation indicator + // http://www.yaml.org/spec/1.2/spec.html#id2793979 + foreach ($lines as $line) { + if ('' !== \trim($line, ' ')) { + return ' ' === \substr($line, 0, 1) ? (string) $this->indentation : ''; + } + } + return ''; + } +} diff --git a/vendor/symfony/yaml/Escaper.php b/vendor/symfony/yaml/Escaper.php new file mode 100644 index 00000000..fed2b8e3 --- /dev/null +++ b/vendor/symfony/yaml/Escaper.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml; + +/** + * Escaper encapsulates escaping rules for single and double-quoted + * YAML strings. + * + * @author Matthew Lewinski + * + * @internal + */ +class Escaper +{ + // Characters that would cause a dumped string to require double quoting. + public const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]||…| |
|
"; + // Mapping arrays for escaping a double quoted string. The backslash is + // first to ensure proper escaping because str_replace operates iteratively + // on the input arrays. This ordering of the characters avoids the use of strtr, + // which performs more slowly. + private const ESCAPEES = ['\\', '\\\\', '\\"', '"', "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\t", "\n", "\v", "\f", "\r", "\x0e", "\x0f", "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f", "", "…", " ", "
", "
"]; + private const ESCAPED = ['\\\\', '\\"', '\\\\', '\\"', '\\0', '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a', '\\b', '\\t', '\\n', '\\v', '\\f', '\\r', '\\x0e', '\\x0f', '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17', '\\x18', '\\x19', '\\x1a', '\\e', '\\x1c', '\\x1d', '\\x1e', '\\x1f', '\\x7f', '\\N', '\\_', '\\L', '\\P']; + /** + * Determines if a PHP value would require double quoting in YAML. + * + * @param string $value A PHP value + */ + public static function requiresDoubleQuoting(string $value) : bool + { + return 0 < \preg_match('/' . self::REGEX_CHARACTER_TO_ESCAPE . '/u', $value); + } + /** + * Escapes and surrounds a PHP value with double quotes. + * + * @param string $value A PHP value + */ + public static function escapeWithDoubleQuotes(string $value) : string + { + return \sprintf('"%s"', \str_replace(self::ESCAPEES, self::ESCAPED, $value)); + } + /** + * Determines if a PHP value would require single quoting in YAML. + * + * @param string $value A PHP value + */ + public static function requiresSingleQuoting(string $value) : bool + { + // Determines if a PHP value is entirely composed of a value that would + // require single quoting in YAML. + if (\in_array(\strtolower($value), ['null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'])) { + return \true; + } + // Determines if the PHP value contains any single characters that would + // cause it to require single quoting in YAML. + return 0 < \preg_match('/[ \\s \' " \\: \\{ \\} \\[ \\] , & \\* \\# \\?] | \\A[ \\- ? | < > = ! % @ ` \\p{Zs}]/xu', $value); + } + /** + * Escapes and surrounds a PHP value with single quotes. + * + * @param string $value A PHP value + */ + public static function escapeWithSingleQuotes(string $value) : string + { + return \sprintf("'%s'", \str_replace('\'', '\'\'', $value)); + } +} diff --git a/vendor/symfony/yaml/Exception/DumpException.php b/vendor/symfony/yaml/Exception/DumpException.php new file mode 100644 index 00000000..74d1b19a --- /dev/null +++ b/vendor/symfony/yaml/Exception/DumpException.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml\Exception; + +/** + * Exception class thrown when an error occurs during dumping. + * + * @author Fabien Potencier + */ +class DumpException extends RuntimeException +{ +} diff --git a/vendor/symfony/yaml/Exception/ExceptionInterface.php b/vendor/symfony/yaml/Exception/ExceptionInterface.php new file mode 100644 index 00000000..a47256a7 --- /dev/null +++ b/vendor/symfony/yaml/Exception/ExceptionInterface.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml\Exception; + +/** + * Exception interface for all exceptions thrown by the component. + * + * @author Fabien Potencier + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/yaml/Exception/ParseException.php b/vendor/symfony/yaml/Exception/ParseException.php new file mode 100644 index 00000000..ddcb2a33 --- /dev/null +++ b/vendor/symfony/yaml/Exception/ParseException.php @@ -0,0 +1,125 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml\Exception; + +/** + * Exception class thrown when an error occurs during parsing. + * + * @author Fabien Potencier + */ +class ParseException extends RuntimeException +{ + /** + * @var string|null + */ + private $parsedFile; + /** + * @var int + */ + private $parsedLine; + /** + * @var string|null + */ + private $snippet; + /** + * @var string + */ + private $rawMessage; + /** + * @param string $message The error message + * @param int $parsedLine The line where the error occurred + * @param string|null $snippet The snippet of code near the problem + * @param string|null $parsedFile The file name where the error occurred + */ + public function __construct(string $message, int $parsedLine = -1, ?string $snippet = null, ?string $parsedFile = null, ?\Throwable $previous = null) + { + $this->parsedFile = $parsedFile; + $this->parsedLine = $parsedLine; + $this->snippet = $snippet; + $this->rawMessage = $message; + $this->updateRepr(); + parent::__construct($this->message, 0, $previous); + } + /** + * Gets the snippet of code near the error. + */ + public function getSnippet() : string + { + return $this->snippet; + } + /** + * Sets the snippet of code near the error. + * + * @return void + */ + public function setSnippet(string $snippet) + { + $this->snippet = $snippet; + $this->updateRepr(); + } + /** + * Gets the filename where the error occurred. + * + * This method returns null if a string is parsed. + */ + public function getParsedFile() : string + { + return $this->parsedFile; + } + /** + * Sets the filename where the error occurred. + * + * @return void + */ + public function setParsedFile(string $parsedFile) + { + $this->parsedFile = $parsedFile; + $this->updateRepr(); + } + /** + * Gets the line where the error occurred. + */ + public function getParsedLine() : int + { + return $this->parsedLine; + } + /** + * Sets the line where the error occurred. + * + * @return void + */ + public function setParsedLine(int $parsedLine) + { + $this->parsedLine = $parsedLine; + $this->updateRepr(); + } + private function updateRepr() : void + { + $this->message = $this->rawMessage; + $dot = \false; + if (\substr_compare($this->message, '.', -\strlen('.')) === 0) { + $this->message = \substr($this->message, 0, -1); + $dot = \true; + } + if (null !== $this->parsedFile) { + $this->message .= \sprintf(' in %s', \json_encode($this->parsedFile, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE)); + } + if ($this->parsedLine >= 0) { + $this->message .= \sprintf(' at line %d', $this->parsedLine); + } + if ($this->snippet) { + $this->message .= \sprintf(' (near "%s")', $this->snippet); + } + if ($dot) { + $this->message .= '.'; + } + } +} diff --git a/vendor/symfony/yaml/Exception/RuntimeException.php b/vendor/symfony/yaml/Exception/RuntimeException.php new file mode 100644 index 00000000..0fa327da --- /dev/null +++ b/vendor/symfony/yaml/Exception/RuntimeException.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml\Exception; + +/** + * Exception class thrown when an error occurs during parsing. + * + * @author Romain Neutron + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/yaml/Inline.php b/vendor/symfony/yaml/Inline.php new file mode 100644 index 00000000..84ccc86d --- /dev/null +++ b/vendor/symfony/yaml/Inline.php @@ -0,0 +1,735 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml; + +use RuleDocGenerator202403\Symfony\Component\Yaml\Exception\DumpException; +use RuleDocGenerator202403\Symfony\Component\Yaml\Exception\ParseException; +use RuleDocGenerator202403\Symfony\Component\Yaml\Tag\TaggedValue; +/** + * Inline implements a YAML parser/dumper for the YAML inline syntax. + * + * @author Fabien Potencier + * + * @internal + */ +class Inline +{ + public const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*+(?:\\\\.[^"\\\\]*+)*+)"|\'([^\']*+(?:\'\'[^\']*+)*+)\')'; + /** + * @var int + */ + public static $parsedLineNumber = -1; + /** + * @var string|null + */ + public static $parsedFilename; + /** + * @var bool + */ + private static $exceptionOnInvalidType = \false; + /** + * @var bool + */ + private static $objectSupport = \false; + /** + * @var bool + */ + private static $objectForMap = \false; + /** + * @var bool + */ + private static $constantSupport = \false; + public static function initialize(int $flags, ?int $parsedLineNumber = null, ?string $parsedFilename = null) : void + { + self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags); + self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags); + self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags); + self::$constantSupport = (bool) (Yaml::PARSE_CONSTANT & $flags); + self::$parsedFilename = $parsedFilename; + if (null !== $parsedLineNumber) { + self::$parsedLineNumber = $parsedLineNumber; + } + } + /** + * Converts a YAML string to a PHP value. + * + * @param int $flags A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior + * @param array $references Mapping of variable names to values + * + * @throws ParseException + * @return mixed + */ + public static function parse(string $value, int $flags = 0, array &$references = []) + { + self::initialize($flags); + $value = \trim($value); + if ('' === $value) { + return ''; + } + $i = 0; + $tag = self::parseTag($value, $i, $flags); + switch ($value[$i]) { + case '[': + $result = self::parseSequence($value, $flags, $i, $references); + ++$i; + break; + case '{': + $result = self::parseMapping($value, $flags, $i, $references); + ++$i; + break; + default: + $result = self::parseScalar($value, $flags, null, $i, \true, $references); + } + // some comments are allowed at the end + if (\preg_replace('/\\s*#.*$/A', '', \substr($value, $i))) { + throw new ParseException(\sprintf('Unexpected characters near "%s".', \substr($value, $i)), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + if (null !== $tag && '' !== $tag) { + return new TaggedValue($tag, $result); + } + return $result; + } + /** + * Dumps a given PHP variable to a YAML string. + * + * @param mixed $value The PHP variable to convert + * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + * + * @throws DumpException When trying to dump PHP resource + */ + public static function dump($value, int $flags = 0) : string + { + switch (\true) { + case \is_resource($value): + if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) { + throw new DumpException(\sprintf('Unable to dump PHP resources in a YAML file ("%s").', \get_resource_type($value))); + } + return self::dumpNull($flags); + case $value instanceof \DateTimeInterface: + return $value->format((function () use($value) { + switch (\true) { + case !($length = \strlen(\rtrim($value->format('u'), '0'))): + return 'c'; + case $length < 4: + return 'Y-m-d\\TH:i:s.vP'; + default: + return 'Y-m-d\\TH:i:s.uP'; + } + })()); + case $value instanceof \UnitEnum: + return \sprintf('!php/const %s::%s', \get_class($value), $value->name); + case \is_object($value): + if ($value instanceof TaggedValue) { + return '!' . $value->getTag() . ' ' . self::dump($value->getValue(), $flags); + } + if (Yaml::DUMP_OBJECT & $flags) { + return '!php/object ' . self::dump(\serialize($value)); + } + if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \stdClass || $value instanceof \ArrayObject)) { + return self::dumpHashArray($value, $flags); + } + if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) { + throw new DumpException('Object support when dumping a YAML file has been disabled.'); + } + return self::dumpNull($flags); + case \is_array($value): + return self::dumpArray($value, $flags); + case null === $value: + return self::dumpNull($flags); + case \true === $value: + return 'true'; + case \false === $value: + return 'false'; + case \is_int($value): + return $value; + case \is_numeric($value) && \false === \strpbrk($value, "\f\n\r\t\v"): + $locale = \setlocale(\LC_NUMERIC, 0); + if (\false !== $locale) { + \setlocale(\LC_NUMERIC, 'C'); + } + if (\is_float($value)) { + $repr = (string) $value; + if (\is_infinite($value)) { + $repr = \str_ireplace('INF', '.Inf', $repr); + } elseif (\floor($value) == $value && $repr == $value) { + // Preserve float data type since storing a whole number will result in integer value. + if (\strpos($repr, 'E') === \false) { + $repr .= '.0'; + } + } + } else { + $repr = \is_string($value) ? "'{$value}'" : (string) $value; + } + if (\false !== $locale) { + \setlocale(\LC_NUMERIC, $locale); + } + return $repr; + case '' == $value: + return "''"; + case self::isBinaryString($value): + return '!!binary ' . \base64_encode($value); + case Escaper::requiresDoubleQuoting($value): + return Escaper::escapeWithDoubleQuotes($value); + case Escaper::requiresSingleQuoting($value): + $singleQuoted = Escaper::escapeWithSingleQuotes($value); + if (\strpos($value, "'") === \false) { + return $singleQuoted; + } + // Attempt double-quoting the string instead to see if it's more efficient. + $doubleQuoted = Escaper::escapeWithDoubleQuotes($value); + return \strlen($doubleQuoted) < \strlen($singleQuoted) ? $doubleQuoted : $singleQuoted; + case Parser::preg_match('{^[0-9]+[_0-9]*$}', $value): + case Parser::preg_match(self::getHexRegex(), $value): + case Parser::preg_match(self::getTimestampRegex(), $value): + return Escaper::escapeWithSingleQuotes($value); + default: + return $value; + } + } + /** + * Check if given array is hash or just normal indexed array. + * @param mixed[]|\ArrayObject|\stdClass $value + */ + public static function isHash($value) : bool + { + if ($value instanceof \stdClass || $value instanceof \ArrayObject) { + return \true; + } + $expectedKey = 0; + foreach ($value as $key => $val) { + if ($key !== $expectedKey++) { + return \true; + } + } + return \false; + } + /** + * Dumps a PHP array to a YAML string. + * + * @param array $value The PHP array to dump + * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + */ + private static function dumpArray(array $value, int $flags) : string + { + // array + if (($value || Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE & $flags) && !self::isHash($value)) { + $output = []; + foreach ($value as $val) { + $output[] = self::dump($val, $flags); + } + return \sprintf('[%s]', \implode(', ', $output)); + } + return self::dumpHashArray($value, $flags); + } + /** + * Dumps hash array to a YAML string. + * + * @param array|\ArrayObject|\stdClass $value The hash array to dump + * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + */ + private static function dumpHashArray($value, int $flags) : string + { + $output = []; + foreach ($value as $key => $val) { + if (\is_int($key) && Yaml::DUMP_NUMERIC_KEY_AS_STRING & $flags) { + $key = (string) $key; + } + $output[] = \sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags)); + } + return \sprintf('{ %s }', \implode(', ', $output)); + } + private static function dumpNull(int $flags) : string + { + if (Yaml::DUMP_NULL_AS_TILDE & $flags) { + return '~'; + } + return 'null'; + } + /** + * Parses a YAML scalar. + * + * @throws ParseException When malformed inline YAML string is parsed + * @return mixed + */ + public static function parseScalar(string $scalar, int $flags = 0, ?array $delimiters = null, int &$i = 0, bool $evaluate = \true, array &$references = [], ?bool &$isQuoted = null) + { + if (\in_array($scalar[$i], ['"', "'"], \true)) { + // quoted scalar + $isQuoted = \true; + $output = self::parseQuotedScalar($scalar, $i); + if (null !== $delimiters) { + $tmp = \ltrim(\substr($scalar, $i), " \n"); + if ('' === $tmp) { + throw new ParseException(\sprintf('Unexpected end of line, expected one of "%s".', \implode('', $delimiters)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + if (!\in_array($tmp[0], $delimiters)) { + throw new ParseException(\sprintf('Unexpected characters (%s).', \substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + } + } else { + // "normal" string + $isQuoted = \false; + if (!$delimiters) { + $output = \substr($scalar, $i); + $i += \strlen($output); + // remove comments + if (Parser::preg_match('/[ \\t]+#/', $output, $match, \PREG_OFFSET_CAPTURE)) { + $output = \substr($output, 0, $match[0][1]); + } + } elseif (Parser::preg_match('/^(.*?)(' . \implode('|', $delimiters) . ')/', \substr($scalar, $i), $match)) { + $output = $match[1]; + $i += \strlen($output); + $output = \trim($output); + } else { + throw new ParseException(\sprintf('Malformed inline YAML string: "%s".', $scalar), self::$parsedLineNumber + 1, null, self::$parsedFilename); + } + // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >) + if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0] || '%' === $output[0])) { + throw new ParseException(\sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0]), self::$parsedLineNumber + 1, $output, self::$parsedFilename); + } + if ($evaluate) { + $output = self::evaluateScalar($output, $flags, $references, $isQuoted); + } + } + return $output; + } + /** + * Parses a YAML quoted scalar. + * + * @throws ParseException When malformed inline YAML string is parsed + */ + private static function parseQuotedScalar(string $scalar, int &$i = 0) : string + { + if (!Parser::preg_match('/' . self::REGEX_QUOTED_STRING . '/Au', \substr($scalar, $i), $match)) { + throw new ParseException(\sprintf('Malformed inline YAML string: "%s".', \substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + $output = \substr($match[0], 1, -1); + $unescaper = new Unescaper(); + if ('"' == $scalar[$i]) { + $output = $unescaper->unescapeDoubleQuotedString($output); + } else { + $output = $unescaper->unescapeSingleQuotedString($output); + } + $i += \strlen($match[0]); + return $output; + } + /** + * Parses a YAML sequence. + * + * @throws ParseException When malformed inline YAML string is parsed + */ + private static function parseSequence(string $sequence, int $flags, int &$i = 0, array &$references = []) : array + { + $output = []; + $len = \strlen($sequence); + ++$i; + // [foo, bar, ...] + while ($i < $len) { + if (']' === $sequence[$i]) { + return $output; + } + if (',' === $sequence[$i] || ' ' === $sequence[$i]) { + ++$i; + continue; + } + $tag = self::parseTag($sequence, $i, $flags); + switch ($sequence[$i]) { + case '[': + // nested sequence + $value = self::parseSequence($sequence, $flags, $i, $references); + break; + case '{': + // nested mapping + $value = self::parseMapping($sequence, $flags, $i, $references); + break; + default: + $value = self::parseScalar($sequence, $flags, [',', ']'], $i, null === $tag, $references, $isQuoted); + // the value can be an array if a reference has been resolved to an array var + if (\is_string($value) && !$isQuoted && \strpos($value, ': ') !== \false) { + // embedded mapping? + try { + $pos = 0; + $value = self::parseMapping('{' . $value . '}', $flags, $pos, $references); + } catch (\InvalidArgumentException $exception) { + // no, it's not + } + } + if (!$isQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) { + $references[$matches['ref']] = $matches['value']; + $value = $matches['value']; + } + --$i; + } + if (null !== $tag && '' !== $tag) { + $value = new TaggedValue($tag, $value); + } + $output[] = $value; + ++$i; + } + throw new ParseException(\sprintf('Malformed inline YAML string: "%s".', $sequence), self::$parsedLineNumber + 1, null, self::$parsedFilename); + } + /** + * Parses a YAML mapping. + * + * @throws ParseException When malformed inline YAML string is parsed + * @return mixed[]|\stdClass + */ + private static function parseMapping(string $mapping, int $flags, int &$i = 0, array &$references = []) + { + $output = []; + $len = \strlen($mapping); + ++$i; + $allowOverwrite = \false; + // {foo: bar, bar:foo, ...} + while ($i < $len) { + switch ($mapping[$i]) { + case ' ': + case ',': + case "\n": + ++$i; + continue 2; + case '}': + if (self::$objectForMap) { + return (object) $output; + } + return $output; + } + // key + $offsetBeforeKeyParsing = $i; + $isKeyQuoted = \in_array($mapping[$i], ['"', "'"], \true); + $key = self::parseScalar($mapping, $flags, [':', ' '], $i, \false); + if ($offsetBeforeKeyParsing === $i) { + throw new ParseException('Missing mapping key.', self::$parsedLineNumber + 1, $mapping); + } + if ('!php/const' === $key || '!php/enum' === $key) { + $key .= ' ' . self::parseScalar($mapping, $flags, [':'], $i, \false); + $key = self::evaluateScalar($key, $flags); + } + if (\false === ($i = \strpos($mapping, ':', $i))) { + break; + } + if (!$isKeyQuoted) { + $evaluatedKey = self::evaluateScalar($key, $flags, $references); + if ('' !== $key && $evaluatedKey !== $key && !\is_string($evaluatedKey) && !\is_int($evaluatedKey)) { + throw new ParseException('Implicit casting of incompatible mapping keys to strings is not supported. Quote your evaluable mapping keys instead.', self::$parsedLineNumber + 1, $mapping); + } + } + if (!$isKeyQuoted && (!isset($mapping[$i + 1]) || !\in_array($mapping[$i + 1], [' ', ',', '[', ']', '{', '}', "\n"], \true))) { + throw new ParseException('Colons must be followed by a space or an indication character (i.e. " ", ",", "[", "]", "{", "}").', self::$parsedLineNumber + 1, $mapping); + } + if ('<<' === $key) { + $allowOverwrite = \true; + } + while ($i < $len) { + if (':' === $mapping[$i] || ' ' === $mapping[$i] || "\n" === $mapping[$i]) { + ++$i; + continue; + } + $tag = self::parseTag($mapping, $i, $flags); + switch ($mapping[$i]) { + case '[': + // nested sequence + $value = self::parseSequence($mapping, $flags, $i, $references); + // Spec: Keys MUST be unique; first one wins. + // Parser cannot abort this mapping earlier, since lines + // are processed sequentially. + // But overwriting is allowed when a merge node is used in current block. + if ('<<' === $key) { + foreach ($value as $parsedValue) { + $output += $parsedValue; + } + } elseif ($allowOverwrite || !isset($output[$key])) { + if (null !== $tag) { + $output[$key] = new TaggedValue($tag, $value); + } else { + $output[$key] = $value; + } + } elseif (isset($output[$key])) { + throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping); + } + break; + case '{': + // nested mapping + $value = self::parseMapping($mapping, $flags, $i, $references); + // Spec: Keys MUST be unique; first one wins. + // Parser cannot abort this mapping earlier, since lines + // are processed sequentially. + // But overwriting is allowed when a merge node is used in current block. + if ('<<' === $key) { + $output += $value; + } elseif ($allowOverwrite || !isset($output[$key])) { + if (null !== $tag) { + $output[$key] = new TaggedValue($tag, $value); + } else { + $output[$key] = $value; + } + } elseif (isset($output[$key])) { + throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping); + } + break; + default: + $value = self::parseScalar($mapping, $flags, [',', '}', "\n"], $i, null === $tag, $references, $isValueQuoted); + // Spec: Keys MUST be unique; first one wins. + // Parser cannot abort this mapping earlier, since lines + // are processed sequentially. + // But overwriting is allowed when a merge node is used in current block. + if ('<<' === $key) { + $output += $value; + } elseif ($allowOverwrite || !isset($output[$key])) { + if (!$isValueQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && !self::isBinaryString($value) && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) { + $references[$matches['ref']] = $matches['value']; + $value = $matches['value']; + } + if (null !== $tag) { + $output[$key] = new TaggedValue($tag, $value); + } else { + $output[$key] = $value; + } + } elseif (isset($output[$key])) { + throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping); + } + --$i; + } + ++$i; + continue 2; + } + } + throw new ParseException(\sprintf('Malformed inline YAML string: "%s".', $mapping), self::$parsedLineNumber + 1, null, self::$parsedFilename); + } + /** + * Evaluates scalars and replaces magic values. + * + * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved + * @return mixed + */ + private static function evaluateScalar(string $scalar, int $flags, array &$references = [], ?bool &$isQuotedString = null) + { + $isQuotedString = \false; + $scalar = \trim($scalar); + if (\strncmp($scalar, '*', \strlen('*')) === 0) { + if (\false !== ($pos = \strpos($scalar, '#'))) { + $value = \substr($scalar, 1, $pos - 2); + } else { + $value = \substr($scalar, 1); + } + // an unquoted * + if (\false === $value || '' === $value) { + throw new ParseException('A reference must contain at least one character.', self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + if (!\array_key_exists($value, $references)) { + throw new ParseException(\sprintf('Reference "%s" does not exist.', $value), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + return $references[$value]; + } + $scalarLower = \strtolower($scalar); + switch (\true) { + case 'null' === $scalarLower: + case '' === $scalar: + case '~' === $scalar: + return null; + case 'true' === $scalarLower: + return \true; + case 'false' === $scalarLower: + return \false; + case '!' === $scalar[0]: + switch (\true) { + case \strncmp($scalar, '!!str ', \strlen('!!str ')) === 0: + $s = (string) \substr($scalar, 6); + if (\in_array($s[0] ?? '', ['"', "'"], \true)) { + $isQuotedString = \true; + $s = self::parseQuotedScalar($s); + } + return $s; + case \strncmp($scalar, '! ', \strlen('! ')) === 0: + return \substr($scalar, 2); + case \strncmp($scalar, '!php/object', \strlen('!php/object')) === 0: + if (self::$objectSupport) { + if (!isset($scalar[12])) { + throw new ParseException('Missing value for tag "!php/object".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + return \unserialize(self::parseScalar(\substr($scalar, 12))); + } + if (self::$exceptionOnInvalidType) { + throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + return null; + case \strncmp($scalar, '!php/const', \strlen('!php/const')) === 0: + if (self::$constantSupport) { + if (!isset($scalar[11])) { + throw new ParseException('Missing value for tag "!php/const".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + $i = 0; + if (\defined($const = self::parseScalar(\substr($scalar, 11), 0, null, $i, \false))) { + return \constant($const); + } + throw new ParseException(\sprintf('The constant "%s" is not defined.', $const), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + if (self::$exceptionOnInvalidType) { + throw new ParseException(\sprintf('The string "%s" could not be parsed as a constant. Did you forget to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + return null; + case \strncmp($scalar, '!php/enum', \strlen('!php/enum')) === 0: + if (self::$constantSupport) { + if (!isset($scalar[11])) { + throw new ParseException('Missing value for tag "!php/enum".', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + $i = 0; + $enum = self::parseScalar(\substr($scalar, 10), 0, null, $i, \false); + if ($useValue = \substr_compare($enum, '->value', -\strlen('->value')) === 0) { + $enum = \substr($enum, 0, -7); + } + if (!\defined($enum)) { + throw new ParseException(\sprintf('The enum "%s" is not defined.', $enum), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + $value = \constant($enum); + if (!$value instanceof \UnitEnum) { + throw new ParseException(\sprintf('The string "%s" is not the name of a valid enum.', $enum), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + if (!$useValue) { + return $value; + } + if (!$value instanceof \BackedEnum) { + throw new ParseException(\sprintf('The enum "%s" defines no value next to its name.', $enum), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + return $value->value; + } + if (self::$exceptionOnInvalidType) { + throw new ParseException(\sprintf('The string "%s" could not be parsed as an enum. Did you forget to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + return null; + case \strncmp($scalar, '!!float ', \strlen('!!float ')) === 0: + return (float) \substr($scalar, 8); + case \strncmp($scalar, '!!binary ', \strlen('!!binary ')) === 0: + return self::evaluateBinaryScalar(\substr($scalar, 9)); + } + throw new ParseException(\sprintf('The string "%s" could not be parsed as it uses an unsupported built-in tag.', $scalar), self::$parsedLineNumber, $scalar, self::$parsedFilename); + case \preg_match('/^(?:\\+|-)?0o(?P[0-7_]++)$/', $scalar, $matches): + $value = \str_replace('_', '', $matches['value']); + if ('-' === $scalar[0]) { + return -\octdec($value); + } + return \octdec($value); + case \in_array($scalar[0], ['+', '-', '.'], \true) || \is_numeric($scalar[0]): + if (Parser::preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar)) { + $scalar = \str_replace('_', '', $scalar); + } + switch (\true) { + case \ctype_digit($scalar): + case '-' === $scalar[0] && \ctype_digit(\substr($scalar, 1)): + $cast = (int) $scalar; + return $scalar === (string) $cast ? $cast : $scalar; + case \is_numeric($scalar): + case Parser::preg_match(self::getHexRegex(), $scalar): + $scalar = \str_replace('_', '', $scalar); + return '0x' === $scalar[0] . $scalar[1] ? \hexdec($scalar) : (float) $scalar; + case '.inf' === $scalarLower: + case '.nan' === $scalarLower: + return -\log(0); + case '-.inf' === $scalarLower: + return \log(0); + case Parser::preg_match('/^(-|\\+)?[0-9][0-9_]*(\\.[0-9_]+)?$/', $scalar): + return (float) \str_replace('_', '', $scalar); + case Parser::preg_match(self::getTimestampRegex(), $scalar): + // When no timezone is provided in the parsed date, YAML spec says we must assume UTC. + $time = new \DateTimeImmutable($scalar, new \DateTimeZone('UTC')); + if (Yaml::PARSE_DATETIME & $flags) { + return $time; + } + if ('' !== \rtrim($time->format('u'), '0')) { + return (float) $time->format('U.u'); + } + try { + if (\false !== ($scalar = $time->getTimestamp())) { + return $scalar; + } + } catch (\ValueError $exception) { + // no-op + } + return $time->format('U'); + } + } + return (string) $scalar; + } + private static function parseTag(string $value, int &$i, int $flags) : ?string + { + if ('!' !== $value[$i]) { + return null; + } + $tagLength = \strcspn($value, " \t\n[]{},", $i + 1); + $tag = \substr($value, $i + 1, $tagLength); + $nextOffset = $i + $tagLength + 1; + $nextOffset += \strspn($value, ' ', $nextOffset); + if ('' === $tag && (!isset($value[$nextOffset]) || \in_array($value[$nextOffset], [']', '}', ','], \true))) { + throw new ParseException('Using the unquoted scalar value "!" is not supported. You must quote it.', self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + // Is followed by a scalar and is a built-in tag + if ('' !== $tag && (!isset($value[$nextOffset]) || !\in_array($value[$nextOffset], ['[', '{'], \true)) && ('!' === $tag[0] || \in_array($tag, ['str', 'php/const', 'php/enum', 'php/object'], \true))) { + // Manage in {@link self::evaluateScalar()} + return null; + } + $i = $nextOffset; + // Built-in tags + if ('' !== $tag && '!' === $tag[0]) { + throw new ParseException(\sprintf('The built-in tag "!%s" is not implemented.', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + if ('' !== $tag && !isset($value[$i])) { + throw new ParseException(\sprintf('Missing value for tag "%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + if ('' === $tag || Yaml::PARSE_CUSTOM_TAGS & $flags) { + return $tag; + } + throw new ParseException(\sprintf('Tags support is not enabled. Enable the "Yaml::PARSE_CUSTOM_TAGS" flag to use "!%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + public static function evaluateBinaryScalar(string $scalar) : string + { + $parsedBinaryData = self::parseScalar(\preg_replace('/\\s/', '', $scalar)); + if (0 !== \strlen($parsedBinaryData) % 4) { + throw new ParseException(\sprintf('The normalized base64 encoded data (data without whitespace characters) length must be a multiple of four (%d bytes given).', \strlen($parsedBinaryData)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + if (!Parser::preg_match('#^[A-Z0-9+/]+={0,2}$#i', $parsedBinaryData)) { + throw new ParseException(\sprintf('The base64 encoded data (%s) contains invalid characters.', $parsedBinaryData), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + return \base64_decode($parsedBinaryData, \true); + } + private static function isBinaryString(string $value) : bool + { + return !\preg_match('//u', $value) || \preg_match('/[^\\x00\\x07-\\x0d\\x1B\\x20-\\xff]/', $value); + } + /** + * Gets a regex that matches a YAML date. + * + * @see http://www.yaml.org/spec/1.2/spec.html#id2761573 + */ + private static function getTimestampRegex() : string + { + return <<[0-9][0-9][0-9][0-9]) + -(?P[0-9][0-9]?) + -(?P[0-9][0-9]?) + (?:(?:[Tt]|[ \t]+) + (?P[0-9][0-9]?) + :(?P[0-9][0-9]) + :(?P[0-9][0-9]) + (?:\\.(?P[0-9]*))? + (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) + (?::(?P[0-9][0-9]))?))?)? + \$~x +EOF; + } + /** + * Gets a regex that matches a YAML number in hexadecimal notation. + */ + private static function getHexRegex() : string + { + return '~^0x[0-9a-f_]++$~i'; + } +} diff --git a/vendor/symfony/yaml/LICENSE b/vendor/symfony/yaml/LICENSE new file mode 100644 index 00000000..0138f8f0 --- /dev/null +++ b/vendor/symfony/yaml/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-present Fabien Potencier + +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/symfony/yaml/Parser.php b/vendor/symfony/yaml/Parser.php new file mode 100644 index 00000000..42c90961 --- /dev/null +++ b/vendor/symfony/yaml/Parser.php @@ -0,0 +1,1062 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml; + +use RuleDocGenerator202403\Symfony\Component\Yaml\Exception\ParseException; +use RuleDocGenerator202403\Symfony\Component\Yaml\Tag\TaggedValue; +/** + * Parser parses YAML strings to convert them to PHP arrays. + * + * @author Fabien Potencier + * + * @final + */ +class Parser +{ + public const TAG_PATTERN = '(?P![\\w!.\\/:-]+)'; + public const BLOCK_SCALAR_HEADER_PATTERN = '(?P\\||>)(?P\\+|\\-|\\d+|\\+\\d+|\\-\\d+|\\d+\\+|\\d+\\-)?(?P +#.*)?'; + public const REFERENCE_PATTERN = '#^&(?P[^ ]++) *+(?P.*)#u'; + /** + * @var string|null + */ + private $filename; + /** + * @var int + */ + private $offset = 0; + /** + * @var int + */ + private $numberOfParsedLines = 0; + /** + * @var int|null + */ + private $totalNumberOfLines; + /** + * @var mixed[] + */ + private $lines = []; + /** + * @var int + */ + private $currentLineNb = -1; + /** + * @var string + */ + private $currentLine = ''; + /** + * @var mixed[] + */ + private $refs = []; + /** + * @var mixed[] + */ + private $skippedLineNumbers = []; + /** + * @var mixed[] + */ + private $locallySkippedLineNumbers = []; + /** + * @var mixed[] + */ + private $refsBeingParsed = []; + /** + * Parses a YAML file into a PHP value. + * + * @param string $filename The path to the YAML file to be parsed + * @param int $flags A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior + * + * @throws ParseException If the file could not be read or the YAML is not valid + * @return mixed + */ + public function parseFile(string $filename, int $flags = 0) + { + if (!\is_file($filename)) { + throw new ParseException(\sprintf('File "%s" does not exist.', $filename)); + } + if (!\is_readable($filename)) { + throw new ParseException(\sprintf('File "%s" cannot be read.', $filename)); + } + $this->filename = $filename; + try { + return $this->parse(\file_get_contents($filename), $flags); + } finally { + $this->filename = null; + } + } + /** + * Parses a YAML string to a PHP value. + * + * @param string $value A YAML string + * @param int $flags A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior + * + * @throws ParseException If the YAML is not valid + * @return mixed + */ + public function parse(string $value, int $flags = 0) + { + if (\false === \preg_match('//u', $value)) { + throw new ParseException('The YAML value does not appear to be valid UTF-8.', -1, null, $this->filename); + } + $this->refs = []; + try { + $data = $this->doParse($value, $flags); + } finally { + $this->refsBeingParsed = []; + $this->offset = 0; + $this->lines = []; + $this->currentLine = ''; + $this->numberOfParsedLines = 0; + $this->refs = []; + $this->skippedLineNumbers = []; + $this->locallySkippedLineNumbers = []; + $this->totalNumberOfLines = null; + } + return $data; + } + /** + * @return mixed + */ + private function doParse(string $value, int $flags) + { + $this->currentLineNb = -1; + $this->currentLine = ''; + $value = $this->cleanup($value); + $this->lines = \explode("\n", $value); + $this->numberOfParsedLines = \count($this->lines); + $this->locallySkippedLineNumbers = []; + $this->totalNumberOfLines = $this->totalNumberOfLines ?? $this->numberOfParsedLines; + if (!$this->moveToNextLine()) { + return null; + } + $data = []; + $context = null; + $allowOverwrite = \false; + while ($this->isCurrentLineEmpty()) { + if (!$this->moveToNextLine()) { + return null; + } + } + // Resolves the tag and returns if end of the document + if (null !== ($tag = $this->getLineTag($this->currentLine, $flags, \false)) && !$this->moveToNextLine()) { + return new TaggedValue($tag, ''); + } + do { + if ($this->isCurrentLineEmpty()) { + continue; + } + // tab? + if ("\t" === $this->currentLine[0]) { + throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + Inline::initialize($flags, $this->getRealCurrentLineNb(), $this->filename); + $isRef = $mergeNode = \false; + if ('-' === $this->currentLine[0] && self::preg_match('#^\\-((?P\\s+)(?P.+))?$#u', \rtrim($this->currentLine), $values)) { + if ($context && 'mapping' == $context) { + throw new ParseException('You cannot define a sequence item when in a mapping.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + $context = 'sequence'; + if (isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) { + $isRef = $matches['ref']; + $this->refsBeingParsed[] = $isRef; + $values['value'] = $matches['value']; + } + if (isset($values['value'][1]) && '?' === $values['value'][0] && ' ' === $values['value'][1]) { + throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + // array + if (isset($values['value']) && \strncmp(\ltrim($values['value'], ' '), '-', \strlen('-')) === 0) { + // Inline first child + $currentLineNumber = $this->getRealCurrentLineNb(); + $sequenceIndentation = \strlen($values['leadspaces']) + 1; + $sequenceYaml = \substr($this->currentLine, $sequenceIndentation); + $sequenceYaml .= "\n" . $this->getNextEmbedBlock($sequenceIndentation, \true); + $data[] = $this->parseBlock($currentLineNumber, \rtrim($sequenceYaml), $flags); + } elseif (!isset($values['value']) || '' == \trim($values['value'], ' ') || \strncmp(\ltrim($values['value'], ' '), '#', \strlen('#')) === 0) { + $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, \true) ?? '', $flags); + } elseif (null !== ($subTag = $this->getLineTag(\ltrim($values['value'], ' '), $flags))) { + $data[] = new TaggedValue($subTag, $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, \true), $flags)); + } else { + if (isset($values['leadspaces']) && ('!' === $values['value'][0] || self::preg_match('#^(?P' . Inline::REGEX_QUOTED_STRING . '|[^ \'"\\{\\[].*?) *\\:(\\s+(?P.+?))?\\s*$#u', $this->trimTag($values['value']), $matches))) { + $block = $values['value']; + if ($this->isNextLineIndented() || isset($matches['value']) && '>-' === $matches['value']) { + $block .= "\n" . $this->getNextEmbedBlock($this->getCurrentLineIndentation() + \strlen($values['leadspaces']) + 1); + } + $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $flags); + } else { + $data[] = $this->parseValue($values['value'], $flags, $context); + } + } + if ($isRef) { + $this->refs[$isRef] = \end($data); + \array_pop($this->refsBeingParsed); + } + } elseif (self::preg_match('#^(?P(?:![^\\s]++\\s++)?(?:' . Inline::REGEX_QUOTED_STRING . '|(?:!?!php/const:)?[^ \'"\\[\\{!].*?)) *\\:(( |\\t)++(?P.+))?$#u', \rtrim($this->currentLine), $values) && (\strpos($values['key'], ' #') === \false || \in_array($values['key'][0], ['"', "'"]))) { + if (\strncmp($values['key'], '!php/const:', \strlen('!php/const:')) === 0) { + trigger_deprecation('symfony/yaml', '6.2', 'YAML syntax for key "%s" is deprecated and replaced by "!php/const %s".', $values['key'], \substr($values['key'], 11)); + } + if ($context && 'sequence' == $context) { + throw new ParseException('You cannot define a mapping item when in a sequence.', $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + $context = 'mapping'; + try { + $key = Inline::parseScalar($values['key']); + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + throw $e; + } + if (!\is_string($key) && !\is_int($key)) { + throw new ParseException((\is_numeric($key) ? 'Numeric' : 'Non-string') . ' keys are not supported. Quote your evaluable mapping keys instead.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + // Convert float keys to strings, to avoid being converted to integers by PHP + if (\is_float($key)) { + $key = (string) $key; + } + if ('<<' === $key && (!isset($values['value']) || '&' !== $values['value'][0] || !self::preg_match('#^&(?P[^ ]+)#u', $values['value'], $refMatches))) { + $mergeNode = \true; + $allowOverwrite = \true; + if (isset($values['value'][0]) && '*' === $values['value'][0]) { + $refName = \substr(\rtrim($values['value']), 1); + if (!\array_key_exists($refName, $this->refs)) { + if (\false !== ($pos = \array_search($refName, $this->refsBeingParsed, \true))) { + throw new ParseException(\sprintf('Circular reference [%s] detected for reference "%s".', \implode(', ', \array_merge(\array_slice($this->refsBeingParsed, $pos), [$refName])), $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + throw new ParseException(\sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + $refValue = $this->refs[$refName]; + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $refValue instanceof \stdClass) { + $refValue = (array) $refValue; + } + if (!\is_array($refValue)) { + throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + $data += $refValue; + // array union + } else { + if (isset($values['value']) && '' !== $values['value']) { + $value = $values['value']; + } else { + $value = $this->getNextEmbedBlock(); + } + $parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $flags); + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsed instanceof \stdClass) { + $parsed = (array) $parsed; + } + if (!\is_array($parsed)) { + throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + if (isset($parsed[0])) { + // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes + // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier + // in the sequence override keys specified in later mapping nodes. + foreach ($parsed as $parsedItem) { + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsedItem instanceof \stdClass) { + $parsedItem = (array) $parsedItem; + } + if (!\is_array($parsedItem)) { + throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem, $this->filename); + } + $data += $parsedItem; + // array union + } + } else { + // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the + // current mapping, unless the key already exists in it. + $data += $parsed; + // array union + } + } + } elseif ('<<' !== $key && isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) { + $isRef = $matches['ref']; + $this->refsBeingParsed[] = $isRef; + $values['value'] = $matches['value']; + } + $subTag = null; + if ($mergeNode) { + // Merge keys + } elseif (!isset($values['value']) || '' === $values['value'] || \strncmp($values['value'], '#', \strlen('#')) === 0 || null !== ($subTag = $this->getLineTag($values['value'], $flags)) || '<<' === $key) { + // hash + // if next line is less indented or equal, then it means that the current value is null + if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) { + // Spec: Keys MUST be unique; first one wins. + // But overwriting is allowed when a merge node is used in current block. + if ($allowOverwrite || !isset($data[$key])) { + if (null !== $subTag) { + $data[$key] = new TaggedValue($subTag, ''); + } else { + $data[$key] = null; + } + } else { + throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + } else { + // remember the parsed line number here in case we need it to provide some contexts in error messages below + $realCurrentLineNbKey = $this->getRealCurrentLineNb(); + $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $flags); + if ('<<' === $key) { + $this->refs[$refMatches['ref']] = $value; + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $value instanceof \stdClass) { + $value = (array) $value; + } + $data += $value; + } elseif ($allowOverwrite || !isset($data[$key])) { + // Spec: Keys MUST be unique; first one wins. + // But overwriting is allowed when a merge node is used in current block. + if (null !== $subTag) { + $data[$key] = new TaggedValue($subTag, $value); + } else { + $data[$key] = $value; + } + } else { + throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), $realCurrentLineNbKey + 1, $this->currentLine); + } + } + } else { + $value = $this->parseValue(\rtrim($values['value']), $flags, $context); + // Spec: Keys MUST be unique; first one wins. + // But overwriting is allowed when a merge node is used in current block. + if ($allowOverwrite || !isset($data[$key])) { + $data[$key] = $value; + } else { + throw new ParseException(\sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + } + if ($isRef) { + $this->refs[$isRef] = $data[$key]; + \array_pop($this->refsBeingParsed); + } + } elseif ('"' === $this->currentLine[0] || "'" === $this->currentLine[0]) { + if (null !== $context) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + try { + return Inline::parse($this->lexInlineQuotedString(), $flags, $this->refs); + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + throw $e; + } + } elseif ('{' === $this->currentLine[0]) { + if (null !== $context) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + try { + $parsedMapping = Inline::parse($this->lexInlineMapping(), $flags, $this->refs); + while ($this->moveToNextLine()) { + if (!$this->isCurrentLineEmpty()) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } + return $parsedMapping; + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + throw $e; + } + } elseif ('[' === $this->currentLine[0]) { + if (null !== $context) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + try { + $parsedSequence = Inline::parse($this->lexInlineSequence(), $flags, $this->refs); + while ($this->moveToNextLine()) { + if (!$this->isCurrentLineEmpty()) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } + return $parsedSequence; + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + throw $e; + } + } else { + // multiple documents are not supported + if ('---' === $this->currentLine) { + throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + if ($deprecatedUsage = isset($this->currentLine[1]) && '?' === $this->currentLine[0] && ' ' === $this->currentLine[1]) { + throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + // 1-liner optionally followed by newline(s) + if (\is_string($value) && $this->lines[0] === \trim($value)) { + try { + $value = Inline::parse($this->lines[0], $flags, $this->refs); + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + throw $e; + } + return $value; + } + // try to parse the value as a multi-line string as a last resort + if (0 === $this->currentLineNb) { + $previousLineWasNewline = \false; + $previousLineWasTerminatedWithBackslash = \false; + $value = ''; + foreach ($this->lines as $line) { + $trimmedLine = \trim($line); + if ('#' === ($trimmedLine[0] ?? '')) { + continue; + } + // If the indentation is not consistent at offset 0, it is to be considered as a ParseError + if (0 === $this->offset && !$deprecatedUsage && isset($line[0]) && ' ' === $line[0]) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + if (\strpos($line, ': ') !== \false) { + throw new ParseException('Mapping values are not allowed in multi-line blocks.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + if ('' === $trimmedLine) { + $value .= "\n"; + } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) { + $value .= ' '; + } + if ('' !== $trimmedLine && \substr_compare($line, '\\', -\strlen('\\')) === 0) { + $value .= \ltrim(\substr($line, 0, -1)); + } elseif ('' !== $trimmedLine) { + $value .= $trimmedLine; + } + if ('' === $trimmedLine) { + $previousLineWasNewline = \true; + $previousLineWasTerminatedWithBackslash = \false; + } elseif (\substr_compare($line, '\\', -\strlen('\\')) === 0) { + $previousLineWasNewline = \false; + $previousLineWasTerminatedWithBackslash = \true; + } else { + $previousLineWasNewline = \false; + $previousLineWasTerminatedWithBackslash = \false; + } + } + try { + return Inline::parse(\trim($value)); + } catch (ParseException $exception) { + // fall-through to the ParseException thrown below + } + } + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } while ($this->moveToNextLine()); + if (null !== $tag) { + $data = new TaggedValue($tag, $data); + } + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && 'mapping' === $context && !\is_object($data)) { + $object = new \stdClass(); + foreach ($data as $key => $value) { + $object->{$key} = $value; + } + $data = $object; + } + return empty($data) ? null : $data; + } + /** + * @return mixed + */ + private function parseBlock(int $offset, string $yaml, int $flags) + { + $skippedLineNumbers = $this->skippedLineNumbers; + foreach ($this->locallySkippedLineNumbers as $lineNumber) { + if ($lineNumber < $offset) { + continue; + } + $skippedLineNumbers[] = $lineNumber; + } + $parser = new self(); + $parser->offset = $offset; + $parser->totalNumberOfLines = $this->totalNumberOfLines; + $parser->skippedLineNumbers = $skippedLineNumbers; + $parser->refs =& $this->refs; + $parser->refsBeingParsed = $this->refsBeingParsed; + return $parser->doParse($yaml, $flags); + } + /** + * Returns the current line number (takes the offset into account). + * + * @internal + */ + public function getRealCurrentLineNb() : int + { + $realCurrentLineNumber = $this->currentLineNb + $this->offset; + foreach ($this->skippedLineNumbers as $skippedLineNumber) { + if ($skippedLineNumber > $realCurrentLineNumber) { + break; + } + ++$realCurrentLineNumber; + } + return $realCurrentLineNumber; + } + private function getCurrentLineIndentation() : int + { + if (' ' !== ($this->currentLine[0] ?? '')) { + return 0; + } + return \strlen($this->currentLine) - \strlen(\ltrim($this->currentLine, ' ')); + } + /** + * Returns the next embed block of YAML. + * + * @param int|null $indentation The indent level at which the block is to be read, or null for default + * @param bool $inSequence True if the enclosing data structure is a sequence + * + * @throws ParseException When indentation problem are detected + */ + private function getNextEmbedBlock(?int $indentation = null, bool $inSequence = \false) : string + { + $oldLineIndentation = $this->getCurrentLineIndentation(); + if (!$this->moveToNextLine()) { + return ''; + } + if (null === $indentation) { + $newIndent = null; + $movements = 0; + do { + $EOF = \false; + // empty and comment-like lines do not influence the indentation depth + if ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) { + $EOF = !$this->moveToNextLine(); + if (!$EOF) { + ++$movements; + } + } else { + $newIndent = $this->getCurrentLineIndentation(); + } + } while (!$EOF && null === $newIndent); + for ($i = 0; $i < $movements; ++$i) { + $this->moveToPreviousLine(); + } + $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem(); + if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) { + throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } else { + $newIndent = $indentation; + } + $data = []; + if ($this->getCurrentLineIndentation() >= $newIndent) { + $data[] = \substr($this->currentLine, $newIndent ?? 0); + } elseif ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) { + $data[] = $this->currentLine; + } else { + $this->moveToPreviousLine(); + return ''; + } + if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) { + // the previous line contained a dash but no item content, this line is a sequence item with the same indentation + // and therefore no nested list or mapping + $this->moveToPreviousLine(); + return ''; + } + $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem(); + $isItComment = $this->isCurrentLineComment(); + while ($this->moveToNextLine()) { + if ($isItComment && !$isItUnindentedCollection) { + $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem(); + $isItComment = $this->isCurrentLineComment(); + } + $indent = $this->getCurrentLineIndentation(); + if ($isItUnindentedCollection && !$this->isCurrentLineEmpty() && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) { + $this->moveToPreviousLine(); + break; + } + if ($this->isCurrentLineBlank()) { + $data[] = \substr($this->currentLine, $newIndent); + continue; + } + if ($indent >= $newIndent) { + $data[] = \substr($this->currentLine, $newIndent); + } elseif ($this->isCurrentLineComment()) { + $data[] = $this->currentLine; + } elseif (0 == $indent) { + $this->moveToPreviousLine(); + break; + } else { + throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } + return \implode("\n", $data); + } + private function hasMoreLines() : bool + { + return \count($this->lines) - 1 > $this->currentLineNb; + } + /** + * Moves the parser to the next line. + */ + private function moveToNextLine() : bool + { + if ($this->currentLineNb >= $this->numberOfParsedLines - 1) { + return \false; + } + $this->currentLine = $this->lines[++$this->currentLineNb]; + return \true; + } + /** + * Moves the parser to the previous line. + */ + private function moveToPreviousLine() : bool + { + if ($this->currentLineNb < 1) { + return \false; + } + $this->currentLine = $this->lines[--$this->currentLineNb]; + return \true; + } + /** + * Parses a YAML value. + * + * @param string $value A YAML value + * @param int $flags A bit field of Yaml::PARSE_* constants to customize the YAML parser behavior + * @param string $context The parser context (either sequence or mapping) + * + * @throws ParseException When reference does not exist + * @return mixed + */ + private function parseValue(string $value, int $flags, string $context) + { + if (\strncmp($value, '*', \strlen('*')) === 0) { + if (\false !== ($pos = \strpos($value, '#'))) { + $value = \substr($value, 1, $pos - 2); + } else { + $value = \substr($value, 1); + } + if (!\array_key_exists($value, $this->refs)) { + if (\false !== ($pos = \array_search($value, $this->refsBeingParsed, \true))) { + throw new ParseException(\sprintf('Circular reference [%s] detected for reference "%s".', \implode(', ', \array_merge(\array_slice($this->refsBeingParsed, $pos), [$value])), $value), $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + throw new ParseException(\sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + return $this->refs[$value]; + } + if (\in_array($value[0], ['!', '|', '>'], \true) && self::preg_match('/^(?:' . self::TAG_PATTERN . ' +)?' . self::BLOCK_SCALAR_HEADER_PATTERN . '$/', $value, $matches)) { + $modifiers = $matches['modifiers'] ?? ''; + $data = $this->parseBlockScalar($matches['separator'], \preg_replace('#\\d+#', '', $modifiers), \abs((int) $modifiers)); + if ('' !== $matches['tag'] && '!' !== $matches['tag']) { + if ('!!binary' === $matches['tag']) { + return Inline::evaluateBinaryScalar($data); + } + return new TaggedValue(\substr($matches['tag'], 1), $data); + } + return $data; + } + try { + if ('' !== $value && '{' === $value[0]) { + $cursor = \strlen(\rtrim($this->currentLine)) - \strlen(\rtrim($value)); + return Inline::parse($this->lexInlineMapping($cursor), $flags, $this->refs); + } elseif ('' !== $value && '[' === $value[0]) { + $cursor = \strlen(\rtrim($this->currentLine)) - \strlen(\rtrim($value)); + return Inline::parse($this->lexInlineSequence($cursor), $flags, $this->refs); + } + switch ($value[0] ?? '') { + case '"': + case "'": + $cursor = \strlen(\rtrim($this->currentLine)) - \strlen(\rtrim($value)); + $parsedValue = Inline::parse($this->lexInlineQuotedString($cursor), $flags, $this->refs); + if (isset($this->currentLine[$cursor]) && \preg_replace('/\\s*(#.*)?$/A', '', \substr($this->currentLine, $cursor))) { + throw new ParseException(\sprintf('Unexpected characters near "%s".', \substr($this->currentLine, $cursor))); + } + return $parsedValue; + default: + $lines = []; + while ($this->moveToNextLine()) { + // unquoted strings end before the first unindented line + if (0 === $this->getCurrentLineIndentation()) { + $this->moveToPreviousLine(); + break; + } + $lines[] = \trim($this->currentLine); + } + for ($i = 0, $linesCount = \count($lines), $previousLineBlank = \false; $i < $linesCount; ++$i) { + if ('' === $lines[$i]) { + $value .= "\n"; + $previousLineBlank = \true; + } elseif ($previousLineBlank) { + $value .= $lines[$i]; + $previousLineBlank = \false; + } else { + $value .= ' ' . $lines[$i]; + $previousLineBlank = \false; + } + } + Inline::$parsedLineNumber = $this->getRealCurrentLineNb(); + $parsedValue = Inline::parse($value, $flags, $this->refs); + if ('mapping' === $context && \is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && \strpos($parsedValue, ': ') !== \false) { + throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename); + } + return $parsedValue; + } + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + throw $e; + } + } + /** + * Parses a block scalar. + * + * @param string $style The style indicator that was used to begin this block scalar (| or >) + * @param string $chomping The chomping indicator that was used to begin this block scalar (+ or -) + * @param int $indentation The indentation indicator that was used to begin this block scalar + */ + private function parseBlockScalar(string $style, string $chomping = '', int $indentation = 0) : string + { + $notEOF = $this->moveToNextLine(); + if (!$notEOF) { + return ''; + } + $isCurrentLineBlank = $this->isCurrentLineBlank(); + $blockLines = []; + // leading blank lines are consumed before determining indentation + while ($notEOF && $isCurrentLineBlank) { + // newline only if not EOF + if ($notEOF = $this->moveToNextLine()) { + $blockLines[] = ''; + $isCurrentLineBlank = $this->isCurrentLineBlank(); + } + } + // determine indentation if not specified + if (0 === $indentation) { + $currentLineLength = \strlen($this->currentLine); + for ($i = 0; $i < $currentLineLength && ' ' === $this->currentLine[$i]; ++$i) { + ++$indentation; + } + } + if ($indentation > 0) { + $pattern = \sprintf('/^ {%d}(.*)$/', $indentation); + while ($notEOF && ($isCurrentLineBlank || self::preg_match($pattern, $this->currentLine, $matches))) { + if ($isCurrentLineBlank && \strlen($this->currentLine) > $indentation) { + $blockLines[] = \substr($this->currentLine, $indentation); + } elseif ($isCurrentLineBlank) { + $blockLines[] = ''; + } else { + $blockLines[] = $matches[1]; + } + // newline only if not EOF + if ($notEOF = $this->moveToNextLine()) { + $isCurrentLineBlank = $this->isCurrentLineBlank(); + } + } + } elseif ($notEOF) { + $blockLines[] = ''; + } + if ($notEOF) { + $blockLines[] = ''; + $this->moveToPreviousLine(); + } elseif (!$notEOF && !$this->isCurrentLineLastLineInDocument()) { + $blockLines[] = ''; + } + // folded style + if ('>' === $style) { + $text = ''; + $previousLineIndented = \false; + $previousLineBlank = \false; + for ($i = 0, $blockLinesCount = \count($blockLines); $i < $blockLinesCount; ++$i) { + if ('' === $blockLines[$i]) { + $text .= "\n"; + $previousLineIndented = \false; + $previousLineBlank = \true; + } elseif (' ' === $blockLines[$i][0]) { + $text .= "\n" . $blockLines[$i]; + $previousLineIndented = \true; + $previousLineBlank = \false; + } elseif ($previousLineIndented) { + $text .= "\n" . $blockLines[$i]; + $previousLineIndented = \false; + $previousLineBlank = \false; + } elseif ($previousLineBlank || 0 === $i) { + $text .= $blockLines[$i]; + $previousLineIndented = \false; + $previousLineBlank = \false; + } else { + $text .= ' ' . $blockLines[$i]; + $previousLineIndented = \false; + $previousLineBlank = \false; + } + } + } else { + $text = \implode("\n", $blockLines); + } + // deal with trailing newlines + if ('' === $chomping) { + $text = \preg_replace('/\\n+$/', "\n", $text); + } elseif ('-' === $chomping) { + $text = \preg_replace('/\\n+$/', '', $text); + } + return $text; + } + /** + * Returns true if the next line is indented. + */ + private function isNextLineIndented() : bool + { + $currentIndentation = $this->getCurrentLineIndentation(); + $movements = 0; + do { + $EOF = !$this->moveToNextLine(); + if (!$EOF) { + ++$movements; + } + } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment())); + if ($EOF) { + for ($i = 0; $i < $movements; ++$i) { + $this->moveToPreviousLine(); + } + return \false; + } + $ret = $this->getCurrentLineIndentation() > $currentIndentation; + for ($i = 0; $i < $movements; ++$i) { + $this->moveToPreviousLine(); + } + return $ret; + } + private function isCurrentLineEmpty() : bool + { + return $this->isCurrentLineBlank() || $this->isCurrentLineComment(); + } + private function isCurrentLineBlank() : bool + { + return '' === $this->currentLine || '' === \trim($this->currentLine, ' '); + } + private function isCurrentLineComment() : bool + { + // checking explicitly the first char of the trim is faster than loops or strpos + $ltrimmedLine = '' !== $this->currentLine && ' ' === $this->currentLine[0] ? \ltrim($this->currentLine, ' ') : $this->currentLine; + return '' !== $ltrimmedLine && '#' === $ltrimmedLine[0]; + } + private function isCurrentLineLastLineInDocument() : bool + { + return $this->offset + $this->currentLineNb >= $this->totalNumberOfLines - 1; + } + private function cleanup(string $value) : string + { + $value = \str_replace(["\r\n", "\r"], "\n", $value); + // strip YAML header + $count = 0; + $value = \preg_replace('#^\\%YAML[: ][\\d\\.]+.*\\n#u', '', $value, -1, $count); + $this->offset += $count; + // remove leading comments + $trimmedValue = \preg_replace('#^(\\#.*?\\n)+#s', '', $value, -1, $count); + if (1 === $count) { + // items have been removed, update the offset + $this->offset += \substr_count($value, "\n") - \substr_count($trimmedValue, "\n"); + $value = $trimmedValue; + } + // remove start of the document marker (---) + $trimmedValue = \preg_replace('#^\\-\\-\\-.*?\\n#s', '', $value, -1, $count); + if (1 === $count) { + // items have been removed, update the offset + $this->offset += \substr_count($value, "\n") - \substr_count($trimmedValue, "\n"); + $value = $trimmedValue; + // remove end of the document marker (...) + $value = \preg_replace('#\\.\\.\\.\\s*$#', '', $value); + } + return $value; + } + private function isNextLineUnIndentedCollection() : bool + { + $currentIndentation = $this->getCurrentLineIndentation(); + $movements = 0; + do { + $EOF = !$this->moveToNextLine(); + if (!$EOF) { + ++$movements; + } + } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment())); + if ($EOF) { + return \false; + } + $ret = $this->getCurrentLineIndentation() === $currentIndentation && $this->isStringUnIndentedCollectionItem(); + for ($i = 0; $i < $movements; ++$i) { + $this->moveToPreviousLine(); + } + return $ret; + } + private function isStringUnIndentedCollectionItem() : bool + { + return '-' === \rtrim($this->currentLine) || \strncmp($this->currentLine, '- ', \strlen('- ')) === 0; + } + /** + * A local wrapper for "preg_match" which will throw a ParseException if there + * is an internal error in the PCRE engine. + * + * This avoids us needing to check for "false" every time PCRE is used + * in the YAML engine + * + * @throws ParseException on a PCRE internal error + * + * @internal + */ + public static function preg_match(string $pattern, string $subject, ?array &$matches = null, int $flags = 0, int $offset = 0) : int + { + if (\false === ($ret = \preg_match($pattern, $subject, $matches, $flags, $offset))) { + throw new ParseException(\preg_last_error_msg()); + } + return $ret; + } + /** + * Trim the tag on top of the value. + * + * Prevent values such as "!foo {quz: bar}" to be considered as + * a mapping block. + */ + private function trimTag(string $value) : string + { + if ('!' === $value[0]) { + return \ltrim(\substr($value, 1, \strcspn($value, " \r\n", 1)), ' '); + } + return $value; + } + private function getLineTag(string $value, int $flags, bool $nextLineCheck = \true) : ?string + { + if ('' === $value || '!' !== $value[0] || 1 !== self::preg_match('/^' . self::TAG_PATTERN . ' *( +#.*)?$/', $value, $matches)) { + return null; + } + if ($nextLineCheck && !$this->isNextLineIndented()) { + return null; + } + $tag = \substr($matches['tag'], 1); + // Built-in tags + if ($tag && '!' === $tag[0]) { + throw new ParseException(\sprintf('The built-in tag "!%s" is not implemented.', $tag), $this->getRealCurrentLineNb() + 1, $value, $this->filename); + } + if (Yaml::PARSE_CUSTOM_TAGS & $flags) { + return $tag; + } + throw new ParseException(\sprintf('Tags support is not enabled. You must use the flag "Yaml::PARSE_CUSTOM_TAGS" to use "%s".', $matches['tag']), $this->getRealCurrentLineNb() + 1, $value, $this->filename); + } + private function lexInlineQuotedString(int &$cursor = 0) : string + { + $quotation = $this->currentLine[$cursor]; + $value = $quotation; + ++$cursor; + $previousLineWasNewline = \true; + $previousLineWasTerminatedWithBackslash = \false; + $lineNumber = 0; + do { + if (++$lineNumber > 1) { + $cursor += \strspn($this->currentLine, ' ', $cursor); + } + if ($this->isCurrentLineBlank()) { + $value .= "\n"; + } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) { + $value .= ' '; + } + for (; \strlen($this->currentLine) > $cursor; ++$cursor) { + switch ($this->currentLine[$cursor]) { + case '\\': + if ("'" === $quotation) { + $value .= '\\'; + } elseif (isset($this->currentLine[++$cursor])) { + $value .= '\\' . $this->currentLine[$cursor]; + } + break; + case $quotation: + ++$cursor; + if ("'" === $quotation && isset($this->currentLine[$cursor]) && "'" === $this->currentLine[$cursor]) { + $value .= "''"; + break; + } + return $value . $quotation; + default: + $value .= $this->currentLine[$cursor]; + } + } + if ($this->isCurrentLineBlank()) { + $previousLineWasNewline = \true; + $previousLineWasTerminatedWithBackslash = \false; + } elseif ('\\' === $this->currentLine[-1]) { + $previousLineWasNewline = \false; + $previousLineWasTerminatedWithBackslash = \true; + } else { + $previousLineWasNewline = \false; + $previousLineWasTerminatedWithBackslash = \false; + } + if ($this->hasMoreLines()) { + $cursor = 0; + } + } while ($this->moveToNextLine()); + throw new ParseException('Malformed inline YAML string.'); + } + private function lexUnquotedString(int &$cursor) : string + { + $offset = $cursor; + $cursor += \strcspn($this->currentLine, '[]{},: ', $cursor); + if ($cursor === $offset) { + throw new ParseException('Malformed unquoted YAML string.'); + } + return \substr($this->currentLine, $offset, $cursor - $offset); + } + private function lexInlineMapping(int &$cursor = 0) : string + { + return $this->lexInlineStructure($cursor, '}'); + } + private function lexInlineSequence(int &$cursor = 0) : string + { + return $this->lexInlineStructure($cursor, ']'); + } + private function lexInlineStructure(int &$cursor, string $closingTag) : string + { + $value = $this->currentLine[$cursor]; + ++$cursor; + do { + $this->consumeWhitespaces($cursor); + while (isset($this->currentLine[$cursor])) { + switch ($this->currentLine[$cursor]) { + case '"': + case "'": + $value .= $this->lexInlineQuotedString($cursor); + break; + case ':': + case ',': + $value .= $this->currentLine[$cursor]; + ++$cursor; + break; + case '{': + $value .= $this->lexInlineMapping($cursor); + break; + case '[': + $value .= $this->lexInlineSequence($cursor); + break; + case $closingTag: + $value .= $this->currentLine[$cursor]; + ++$cursor; + return $value; + case '#': + break 2; + default: + $value .= $this->lexUnquotedString($cursor); + } + if ($this->consumeWhitespaces($cursor)) { + $value .= ' '; + } + } + if ($this->hasMoreLines()) { + $cursor = 0; + } + } while ($this->moveToNextLine()); + throw new ParseException('Malformed inline YAML string.'); + } + private function consumeWhitespaces(int &$cursor) : bool + { + $whitespacesConsumed = 0; + do { + $whitespaceOnlyTokenLength = \strspn($this->currentLine, ' ', $cursor); + $whitespacesConsumed += $whitespaceOnlyTokenLength; + $cursor += $whitespaceOnlyTokenLength; + if (isset($this->currentLine[$cursor])) { + return 0 < $whitespacesConsumed; + } + if ($this->hasMoreLines()) { + $cursor = 0; + } + } while ($this->moveToNextLine()); + return 0 < $whitespacesConsumed; + } +} diff --git a/vendor/symfony/yaml/README.md b/vendor/symfony/yaml/README.md new file mode 100644 index 00000000..ac25024b --- /dev/null +++ b/vendor/symfony/yaml/README.md @@ -0,0 +1,13 @@ +Yaml Component +============== + +The Yaml component loads and dumps YAML files. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/yaml.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/yaml/Resources/bin/yaml-lint b/vendor/symfony/yaml/Resources/bin/yaml-lint new file mode 100755 index 00000000..f044f6d9 --- /dev/null +++ b/vendor/symfony/yaml/Resources/bin/yaml-lint @@ -0,0 +1,35 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +if ('cli' !== \PHP_SAPI) { + throw new \Exception('This script must be run from the command line.'); +} +/** + * Runs the Yaml lint command. + * + * @author Jan Schädlich + */ +use RuleDocGenerator202403\Symfony\Component\Console\Application; +use RuleDocGenerator202403\Symfony\Component\Yaml\Command\LintCommand; +function includeIfExists(string $file) : bool +{ + return \file_exists($file) && (include $file); +} +if (!includeIfExists(__DIR__ . '/../../../../autoload.php') && !includeIfExists(__DIR__ . '/../../vendor/autoload.php') && !includeIfExists(__DIR__ . '/../../../../../../vendor/autoload.php')) { + \fwrite(\STDERR, 'Install dependencies using Composer.' . \PHP_EOL); + exit(1); +} +if (!\class_exists(Application::class)) { + \fwrite(\STDERR, 'You need the "symfony/console" component in order to run the Yaml linter.' . \PHP_EOL); + exit(1); +} +(new Application())->add($command = new LintCommand())->getApplication()->setDefaultCommand($command->getName(), \true)->run(); diff --git a/vendor/symfony/yaml/Tag/TaggedValue.php b/vendor/symfony/yaml/Tag/TaggedValue.php new file mode 100644 index 00000000..0751af74 --- /dev/null +++ b/vendor/symfony/yaml/Tag/TaggedValue.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml\Tag; + +/** + * @author Nicolas Grekas + * @author Guilhem N. + */ +final class TaggedValue +{ + /** + * @var string + */ + private $tag; + /** + * @var mixed + */ + private $value; + /** + * @param mixed $value + */ + public function __construct(string $tag, $value) + { + $this->tag = $tag; + $this->value = $value; + } + public function getTag() : string + { + return $this->tag; + } + /** + * @return mixed + */ + public function getValue() + { + return $this->value; + } +} diff --git a/vendor/symfony/yaml/Unescaper.php b/vendor/symfony/yaml/Unescaper.php new file mode 100644 index 00000000..c15a1e3b --- /dev/null +++ b/vendor/symfony/yaml/Unescaper.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml; + +use RuleDocGenerator202403\Symfony\Component\Yaml\Exception\ParseException; +/** + * Unescaper encapsulates unescaping rules for single and double-quoted + * YAML strings. + * + * @author Matthew Lewinski + * + * @internal + */ +class Unescaper +{ + /** + * Regex fragment that matches an escaped character in a double quoted string. + */ + public const REGEX_ESCAPED_CHARACTER = '\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)'; + /** + * Unescapes a single quoted string. + * + * @param string $value A single quoted string + */ + public function unescapeSingleQuotedString(string $value) : string + { + return \str_replace('\'\'', '\'', $value); + } + /** + * Unescapes a double quoted string. + * + * @param string $value A double quoted string + */ + public function unescapeDoubleQuotedString(string $value) : string + { + $callback = function ($match) { + return $this->unescapeCharacter($match[0]); + }; + // evaluate the string + return \preg_replace_callback('/' . self::REGEX_ESCAPED_CHARACTER . '/u', $callback, $value); + } + /** + * Unescapes a character that was found in a double-quoted string. + * + * @param string $value An escaped character + */ + private function unescapeCharacter(string $value) : string + { + switch ($value[1]) { + case '0': + return "\x00"; + case 'a': + return "\x07"; + case 'b': + return "\x08"; + case 't': + return "\t"; + case "\t": + return "\t"; + case 'n': + return "\n"; + case 'v': + return "\v"; + case 'f': + return "\f"; + case 'r': + return "\r"; + case 'e': + return "\x1b"; + case ' ': + return ' '; + case '"': + return '"'; + case '/': + return '/'; + case '\\': + return '\\'; + case 'N': + return "…"; + case '_': + return " "; + case 'L': + return "
"; + case 'P': + return "
"; + case 'x': + return self::utf8chr(\hexdec(\substr($value, 2, 2))); + case 'u': + return self::utf8chr(\hexdec(\substr($value, 2, 4))); + case 'U': + return self::utf8chr(\hexdec(\substr($value, 2, 8))); + default: + throw new ParseException(\sprintf('Found unknown escape character "%s".', $value)); + } + } + /** + * Get the UTF-8 character for the given code point. + */ + private static function utf8chr(int $c) : string + { + if (0x80 > ($c %= 0x200000)) { + return \chr($c); + } + if (0x800 > $c) { + return \chr(0xc0 | $c >> 6) . \chr(0x80 | $c & 0x3f); + } + if (0x10000 > $c) { + return \chr(0xe0 | $c >> 12) . \chr(0x80 | $c >> 6 & 0x3f) . \chr(0x80 | $c & 0x3f); + } + return \chr(0xf0 | $c >> 18) . \chr(0x80 | $c >> 12 & 0x3f) . \chr(0x80 | $c >> 6 & 0x3f) . \chr(0x80 | $c & 0x3f); + } +} diff --git a/vendor/symfony/yaml/Yaml.php b/vendor/symfony/yaml/Yaml.php new file mode 100644 index 00000000..d8c5a31f --- /dev/null +++ b/vendor/symfony/yaml/Yaml.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Symfony\Component\Yaml; + +use RuleDocGenerator202403\Symfony\Component\Yaml\Exception\ParseException; +/** + * Yaml offers convenience methods to load and dump YAML. + * + * @author Fabien Potencier + * + * @final + */ +class Yaml +{ + public const DUMP_OBJECT = 1; + public const PARSE_EXCEPTION_ON_INVALID_TYPE = 2; + public const PARSE_OBJECT = 4; + public const PARSE_OBJECT_FOR_MAP = 8; + public const DUMP_EXCEPTION_ON_INVALID_TYPE = 16; + public const PARSE_DATETIME = 32; + public const DUMP_OBJECT_AS_MAP = 64; + public const DUMP_MULTI_LINE_LITERAL_BLOCK = 128; + public const PARSE_CONSTANT = 256; + public const PARSE_CUSTOM_TAGS = 512; + public const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024; + public const DUMP_NULL_AS_TILDE = 2048; + public const DUMP_NUMERIC_KEY_AS_STRING = 4096; + /** + * Parses a YAML file into a PHP value. + * + * Usage: + * + * $array = Yaml::parseFile('config.yml'); + * print_r($array); + * + * @param string $filename The path to the YAML file to be parsed + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * + * @throws ParseException If the file could not be read or the YAML is not valid + * @return mixed + */ + public static function parseFile(string $filename, int $flags = 0) + { + $yaml = new Parser(); + return $yaml->parseFile($filename, $flags); + } + /** + * Parses YAML into a PHP value. + * + * Usage: + * + * $array = Yaml::parse(file_get_contents('config.yml')); + * print_r($array); + * + * + * @param string $input A string containing YAML + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * + * @throws ParseException If the YAML is not valid + * @return mixed + */ + public static function parse(string $input, int $flags = 0) + { + $yaml = new Parser(); + return $yaml->parse($input, $flags); + } + /** + * Dumps a PHP value to a YAML string. + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. + * + * @param mixed $input The PHP value + * @param int $inline The level where you switch to inline YAML + * @param int $indent The amount of spaces to use for indentation of nested nodes + * @param int $flags A bit field of DUMP_* constants to customize the dumped YAML string + */ + public static function dump($input, int $inline = 2, int $indent = 4, int $flags = 0) : string + { + $yaml = new Dumper($indent); + return $yaml->dump($input, $inline, 0, $flags); + } +} diff --git a/vendor/symfony/yaml/composer.json b/vendor/symfony/yaml/composer.json new file mode 100644 index 00000000..3bd759f2 --- /dev/null +++ b/vendor/symfony/yaml/composer.json @@ -0,0 +1,41 @@ +{ + "name": "symfony\/yaml", + "type": "library", + "description": "Loads and dumps YAML files", + "keywords": [], + "homepage": "https:\/\/symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https:\/\/symfony.com\/contributors" + } + ], + "require": { + "php": ">=8.1", + "symfony\/deprecation-contracts": "^2.5|^3", + "symfony\/polyfill-ctype": "^1.8" + }, + "require-dev": { + "symfony\/console": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony\/console": "<5.4" + }, + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "\/Tests\/" + ] + }, + "bin": [ + "Resources\/bin\/yaml-lint" + ], + "minimum-stability": "dev" +} \ No newline at end of file diff --git a/vendor/symplify/rule-doc-generator-contracts/LICENSE b/vendor/symplify/rule-doc-generator-contracts/LICENSE new file mode 100644 index 00000000..6f40d5d3 --- /dev/null +++ b/vendor/symplify/rule-doc-generator-contracts/LICENSE @@ -0,0 +1,25 @@ +The MIT License +--------------- + +Copyright (c) 2016 Tomas Votruba (https://tomasvotruba.com) + +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/symplify/rule-doc-generator-contracts/composer.json b/vendor/symplify/rule-doc-generator-contracts/composer.json new file mode 100644 index 00000000..05273e60 --- /dev/null +++ b/vendor/symplify/rule-doc-generator-contracts/composer.json @@ -0,0 +1,46 @@ +{ + "name": "symplify\/rule-doc-generator-contracts", + "description": "Contracts for production code of RuleDocGenerator", + "license": "MIT", + "require": { + "php": ">=8.1", + "nette\/utils": "^3.2" + }, + "require-dev": { + "php-parallel-lint\/php-parallel-lint": "^1.3", + "phpstan\/extension-installer": "^1.2", + "rector\/rector": "^0.15.10", + "symplify\/easy-ci": "^11.1", + "symplify\/easy-coding-standard": "^11.1", + "symplify\/easy-testing": "^11.1", + "symplify\/phpstan-extensions": "^11.1", + "symplify\/phpstan-rules": "11.2.3.72", + "tomasvotruba\/unused-public": "^0.0.34" + }, + "autoload": { + "psr-4": { + "Symplify\\RuleDocGenerator\\": "src" + } + }, + "extra": { + "branch-alias": { + "dev-main": "11.2-dev" + } + }, + "scripts": { + "check-cs": "vendor\/bin\/ecs check --ansi", + "fix-cs": "vendor\/bin\/ecs check --fix --ansi", + "phpstan": "vendor\/bin\/phpstan analyse --ansi --error-format symplify", + "rector": "vendor\/bin\/rector process --dry-run --ansi" + }, + "minimum-stability": "dev", + "prefer-stable": true, + "config": { + "sort-packages": true, + "platform-check": false, + "allow-plugins": { + "cweagans\/composer-patches": true, + "phpstan\/extension-installer": true + } + } +} \ No newline at end of file diff --git a/vendor/symplify/rule-doc-generator-contracts/src/Contract/Category/CategoryInfererInterface.php b/vendor/symplify/rule-doc-generator-contracts/src/Contract/Category/CategoryInfererInterface.php new file mode 100644 index 00000000..7a139896 --- /dev/null +++ b/vendor/symplify/rule-doc-generator-contracts/src/Contract/Category/CategoryInfererInterface.php @@ -0,0 +1,10 @@ +goodCode = $goodCode; + $this->badCode = $badCode; + } + public function getGoodCode() : string + { + return $this->goodCode; + } + public function getBadCode() : string + { + return $this->badCode; + } +} diff --git a/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/CodeSample.php b/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/CodeSample.php new file mode 100644 index 00000000..a5dab755 --- /dev/null +++ b/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/CodeSample.php @@ -0,0 +1,12 @@ +composerJson = $composerJson; + parent::__construct($badCode, $goodCode); + } + public function getComposerJson() : string + { + return $this->composerJson; + } +} diff --git a/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ConfiguredCodeSample.php b/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ConfiguredCodeSample.php new file mode 100644 index 00000000..f5c92f0e --- /dev/null +++ b/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ConfiguredCodeSample.php @@ -0,0 +1,34 @@ +configuration = $configuration; + parent::__construct($badCode, $goodCode); + } + /** + * @return mixed[] + */ + public function getConfiguration() : array + { + return $this->configuration; + } +} diff --git a/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ExtraFileCodeSample.php b/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ExtraFileCodeSample.php new file mode 100644 index 00000000..51728aab --- /dev/null +++ b/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/CodeSample/ExtraFileCodeSample.php @@ -0,0 +1,23 @@ +extraFile = $extraFile; + parent::__construct($badCode, $goodCode); + } + public function getExtraFile() : string + { + return $this->extraFile; + } +} diff --git a/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/RuleDefinition.php b/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/RuleDefinition.php new file mode 100644 index 00000000..cfa0c8b7 --- /dev/null +++ b/vendor/symplify/rule-doc-generator-contracts/src/ValueObject/RuleDefinition.php @@ -0,0 +1,91 @@ +description = $description; + if ($codeSamples === []) { + throw new PoorDocumentationException('Provide at least one code sample, so people can practically see what the rule does'); + } + $this->codeSamples = $codeSamples; + } + public function getDescription() : string + { + return $this->description; + } + public function setRuleClass(string $ruleClass) : void + { + $this->ruleClass = $ruleClass; + } + public function getRuleClass() : string + { + if ($this->ruleClass === null) { + throw new ShouldNotHappenException(); + } + return $this->ruleClass; + } + public function setRuleFilePath(string $ruleFilePath) : void + { + // fir relative file path for GitHub + $this->ruleFilePath = \ltrim($ruleFilePath, '/'); + } + public function getRuleFilePath() : string + { + if ($this->ruleFilePath === null) { + throw new ShouldNotHappenException(); + } + return $this->ruleFilePath; + } + public function getRuleShortClass() : string + { + if ($this->ruleClass === null) { + throw new ShouldNotHappenException(); + } + return (string) Strings::after($this->ruleClass, '\\', -1); + } + /** + * @return CodeSampleInterface[] + */ + public function getCodeSamples() : array + { + return $this->codeSamples; + } + public function isConfigurable() : bool + { + foreach ($this->codeSamples as $codeSample) { + if ($codeSample instanceof ConfiguredCodeSample) { + return \true; + } + } + return \false; + } +} diff --git a/vendor/webmozart/assert/CHANGELOG.md b/vendor/webmozart/assert/CHANGELOG.md new file mode 100644 index 00000000..56c8011d --- /dev/null +++ b/vendor/webmozart/assert/CHANGELOG.md @@ -0,0 +1,207 @@ +Changelog +========= + +## UNRELEASED + +## 1.11.0 + +### Added + +* Added explicit (non magic) `allNullOr*` methods, with `@psalm-assert` annotations, for better Psalm support. + +### Changed + +* Trait methods will now check the assertion themselves, instead of using `__callStatic` +* `isList` will now deal correctly with (modified) lists that contain `NaN` +* `reportInvalidArgument` now has a return type of `never`. + +### Removed + +* Removed `symfony/polyfill-ctype` as a dependency, and require `ext-cytpe` instead. + * You can still require the `symfony/polyfill-ctype` in your project if you need it, as it provides `ext-ctype` + +## 1.10.0 + +### Added + +* On invalid assertion, we throw a `Webmozart\Assert\InvalidArgumentException` +* Added `Assert::positiveInteger()` + +### Changed + +* Using a trait with real implementations of `all*()` and `nullOr*()` methods to improve psalm compatibility. + +### Removed + +* Support for PHP <7.2 + +## 1.9.1 + +## Fixed + +* provisional support for PHP 8.0 + +## 1.9.0 + +* added better Psalm support for `all*` & `nullOr*` methods +* These methods are now understood by Psalm through a mixin. You may need a newer version of Psalm in order to use this +* added `@psalm-pure` annotation to `Assert::notFalse()` +* added more `@psalm-assert` annotations where appropriate + +## Changed + +* the `all*` & `nullOr*` methods are now declared on an interface, instead of `@method` annotations. +This interface is linked to the `Assert` class with a `@mixin` annotation. Most IDE's have supported this +for a long time, and you should not lose any autocompletion capabilities. PHPStan has supported this since +version `0.12.20`. This package is marked incompatible (with a composer conflict) with phpstan version prior to that. +If you do not use PHPStan than this does not matter. + +## 1.8.0 + +### Added + +* added `Assert::notStartsWith()` +* added `Assert::notEndsWith()` +* added `Assert::inArray()` +* added `@psalm-pure` annotations to pure assertions + +### Fixed + +* Exception messages of comparisons between `DateTime(Immutable)` objects now display their date & time. +* Custom Exception messages for `Assert::count()` now use the values to render the exception message. + +## 1.7.0 (2020-02-14) + +### Added + +* added `Assert::notFalse()` +* added `Assert::isAOf()` +* added `Assert::isAnyOf()` +* added `Assert::isNotA()` + +## 1.6.0 (2019-11-24) + +### Added + +* added `Assert::validArrayKey()` +* added `Assert::isNonEmptyList()` +* added `Assert::isNonEmptyMap()` +* added `@throws InvalidArgumentException` annotations to all methods that throw. +* added `@psalm-assert` for the list type to the `isList` assertion. + +### Fixed + +* `ResourceBundle` & `SimpleXMLElement` now pass the `isCountable` assertions. +They are countable, without implementing the `Countable` interface. +* The doc block of `range` now has the proper variables. +* An empty array will now pass `isList` and `isMap`. As it is a valid form of both. +If a non-empty variant is needed, use `isNonEmptyList` or `isNonEmptyMap`. + +### Changed + +* Removed some `@psalm-assert` annotations, that were 'side effect' assertions See: + * [#144](https://github.com/webmozart/assert/pull/144) + * [#145](https://github.com/webmozart/assert/issues/145) + * [#146](https://github.com/webmozart/assert/pull/146) + * [#150](https://github.com/webmozart/assert/pull/150) +* If you use Psalm, the minimum version needed is `3.6.0`. Which is enforced through a composer conflict. +If you don't use Psalm, then this has no impact. + +## 1.5.0 (2019-08-24) + +### Added + +* added `Assert::uniqueValues()` +* added `Assert::unicodeLetters()` +* added: `Assert::email()` +* added support for [Psalm](https://github.com/vimeo/psalm), by adding `@psalm-assert` annotations where appropriate. + +### Fixed + +* `Assert::endsWith()` would not give the correct result when dealing with a multibyte suffix. +* `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters. + +**NOTE**: These 2 changes may break your assertions if you relied on the fact that multibyte characters didn't behave correctly. + +### Changed + +* The names of some variables have been updated to better reflect what they are. +* All function calls are now in their FQN form, slightly increasing performance. +* Tests are now properly ran against HHVM-3.30 and PHP nightly. + +### Deprecation + +* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` + * This was already done in 1.3.0, but it was only done through a silenced `trigger_error`. It is now annotated as well. + +## 1.4.0 (2018-12-25) + +### Added + +* added `Assert::ip()` +* added `Assert::ipv4()` +* added `Assert::ipv6()` +* added `Assert::notRegex()` +* added `Assert::interfaceExists()` +* added `Assert::isList()` +* added `Assert::isMap()` +* added polyfill for ctype + +### Fixed + +* Special case when comparing objects implementing `__toString()` + +## 1.3.0 (2018-01-29) + +### Added + +* added `Assert::minCount()` +* added `Assert::maxCount()` +* added `Assert::countBetween()` +* added `Assert::isCountable()` +* added `Assert::notWhitespaceOnly()` +* added `Assert::natural()` +* added `Assert::notContains()` +* added `Assert::isArrayAccessible()` +* added `Assert::isInstanceOfAny()` +* added `Assert::isIterable()` + +### Fixed + +* `stringNotEmpty` will no longer report "0" is an empty string + +### Deprecation + +* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` + +## 1.2.0 (2016-11-23) + + * added `Assert::throws()` + * added `Assert::count()` + * added extension point `Assert::reportInvalidArgument()` for custom subclasses + +## 1.1.0 (2016-08-09) + + * added `Assert::object()` + * added `Assert::propertyExists()` + * added `Assert::propertyNotExists()` + * added `Assert::methodExists()` + * added `Assert::methodNotExists()` + * added `Assert::uuid()` + +## 1.0.2 (2015-08-24) + + * integrated Style CI + * add tests for minimum package dependencies on Travis CI + +## 1.0.1 (2015-05-12) + + * added support for PHP 5.3.3 + +## 1.0.0 (2015-05-12) + + * first stable release + +## 1.0.0-beta (2015-03-19) + + * first beta release diff --git a/vendor/webmozart/assert/LICENSE b/vendor/webmozart/assert/LICENSE new file mode 100644 index 00000000..9e2e3075 --- /dev/null +++ b/vendor/webmozart/assert/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Bernhard Schussek + +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/webmozart/assert/README.md b/vendor/webmozart/assert/README.md new file mode 100644 index 00000000..3b2397a1 --- /dev/null +++ b/vendor/webmozart/assert/README.md @@ -0,0 +1,287 @@ +Webmozart Assert +================ + +[![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert) +[![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert) + +This library contains efficient assertions to test the input and output of +your methods. With these assertions, you can greatly reduce the amount of coding +needed to write a safe implementation. + +All assertions in the [`Assert`] class throw an `Webmozart\Assert\InvalidArgumentException` if +they fail. + +FAQ +--- + +**What's the difference to [beberlei/assert]?** + +This library is heavily inspired by Benjamin Eberlei's wonderful [assert package], +but fixes a usability issue with error messages that can't be fixed there without +breaking backwards compatibility. + +This package features usable error messages by default. However, you can also +easily write custom error messages: + +``` +Assert::string($path, 'The path is expected to be a string. Got: %s'); +``` + +In [beberlei/assert], the ordering of the `%s` placeholders is different for +every assertion. This package, on the contrary, provides consistent placeholder +ordering for all assertions: + +* `%s`: The tested value as string, e.g. `"/foo/bar"`. +* `%2$s`, `%3$s`, ...: Additional assertion-specific values, e.g. the + minimum/maximum length, allowed values, etc. + +Check the source code of the assertions to find out details about the additional +available placeholders. + +Installation +------------ + +Use [Composer] to install the package: + +```bash +composer require webmozart/assert +``` + +Example +------- + +```php +use Webmozart\Assert\Assert; + +class Employee +{ + public function __construct($id) + { + Assert::integer($id, 'The employee ID must be an integer. Got: %s'); + Assert::greaterThan($id, 0, 'The employee ID must be a positive integer. Got: %s'); + } +} +``` + +If you create an employee with an invalid ID, an exception is thrown: + +```php +new Employee('foobar'); +// => Webmozart\Assert\InvalidArgumentException: +// The employee ID must be an integer. Got: string + +new Employee(-10); +// => Webmozart\Assert\InvalidArgumentException: +// The employee ID must be a positive integer. Got: -10 +``` + +Assertions +---------- + +The [`Assert`] class provides the following assertions: + +### Type Assertions + +Method | Description +-------------------------------------------------------- | -------------------------------------------------- +`string($value, $message = '')` | Check that a value is a string +`stringNotEmpty($value, $message = '')` | Check that a value is a non-empty string +`integer($value, $message = '')` | Check that a value is an integer +`integerish($value, $message = '')` | Check that a value casts to an integer +`positiveInteger($value, $message = '')` | Check that a value is a positive (non-zero) integer +`float($value, $message = '')` | Check that a value is a float +`numeric($value, $message = '')` | Check that a value is numeric +`natural($value, $message= ''')` | Check that a value is a non-negative integer +`boolean($value, $message = '')` | Check that a value is a boolean +`scalar($value, $message = '')` | Check that a value is a scalar +`object($value, $message = '')` | Check that a value is an object +`resource($value, $type = null, $message = '')` | Check that a value is a resource +`isCallable($value, $message = '')` | Check that a value is a callable +`isArray($value, $message = '')` | Check that a value is an array +`isTraversable($value, $message = '')` (deprecated) | Check that a value is an array or a `\Traversable` +`isIterable($value, $message = '')` | Check that a value is an array or a `\Traversable` +`isCountable($value, $message = '')` | Check that a value is an array or a `\Countable` +`isInstanceOf($value, $class, $message = '')` | Check that a value is an `instanceof` a class +`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` at least one class on the array of classes +`notInstanceOf($value, $class, $message = '')` | Check that a value is not an `instanceof` a class +`isAOf($value, $class, $message = '')` | Check that a value is of the class or has one of its parents +`isAnyOf($value, array $classes, $message = '')` | Check that a value is of at least one of the classes or has one of its parents +`isNotA($value, $class, $message = '')` | Check that a value is not of the class or has not one of its parents +`isArrayAccessible($value, $message = '')` | Check that a value can be accessed as an array +`uniqueValues($values, $message = '')` | Check that the given array contains unique values + +### Comparison Assertions + +Method | Description +----------------------------------------------- | ------------------------------------------------------------------ +`true($value, $message = '')` | Check that a value is `true` +`false($value, $message = '')` | Check that a value is `false` +`notFalse($value, $message = '')` | Check that a value is not `false` +`null($value, $message = '')` | Check that a value is `null` +`notNull($value, $message = '')` | Check that a value is not `null` +`isEmpty($value, $message = '')` | Check that a value is `empty()` +`notEmpty($value, $message = '')` | Check that a value is not `empty()` +`eq($value, $value2, $message = '')` | Check that a value equals another (`==`) +`notEq($value, $value2, $message = '')` | Check that a value does not equal another (`!=`) +`same($value, $value2, $message = '')` | Check that a value is identical to another (`===`) +`notSame($value, $value2, $message = '')` | Check that a value is not identical to another (`!==`) +`greaterThan($value, $value2, $message = '')` | Check that a value is greater than another +`greaterThanEq($value, $value2, $message = '')` | Check that a value is greater than or equal to another +`lessThan($value, $value2, $message = '')` | Check that a value is less than another +`lessThanEq($value, $value2, $message = '')` | Check that a value is less than or equal to another +`range($value, $min, $max, $message = '')` | Check that a value is within a range +`inArray($value, array $values, $message = '')` | Check that a value is one of a list of values +`oneOf($value, array $values, $message = '')` | Check that a value is one of a list of values (alias of `inArray`) + +### String Assertions + +You should check that a value is a string with `Assert::string()` before making +any of the following assertions. + +Method | Description +--------------------------------------------------- | ----------------------------------------------------------------- +`contains($value, $subString, $message = '')` | Check that a string contains a substring +`notContains($value, $subString, $message = '')` | Check that a string does not contain a substring +`startsWith($value, $prefix, $message = '')` | Check that a string has a prefix +`notStartsWith($value, $prefix, $message = '')` | Check that a string does not have a prefix +`startsWithLetter($value, $message = '')` | Check that a string starts with a letter +`endsWith($value, $suffix, $message = '')` | Check that a string has a suffix +`notEndsWith($value, $suffix, $message = '')` | Check that a string does not have a suffix +`regex($value, $pattern, $message = '')` | Check that a string matches a regular expression +`notRegex($value, $pattern, $message = '')` | Check that a string does not match a regular expression +`unicodeLetters($value, $message = '')` | Check that a string contains Unicode letters only +`alpha($value, $message = '')` | Check that a string contains letters only +`digits($value, $message = '')` | Check that a string contains digits only +`alnum($value, $message = '')` | Check that a string contains letters and digits only +`lower($value, $message = '')` | Check that a string contains lowercase characters only +`upper($value, $message = '')` | Check that a string contains uppercase characters only +`length($value, $length, $message = '')` | Check that a string has a certain number of characters +`minLength($value, $min, $message = '')` | Check that a string has at least a certain number of characters +`maxLength($value, $max, $message = '')` | Check that a string has at most a certain number of characters +`lengthBetween($value, $min, $max, $message = '')` | Check that a string has a length in the given range +`uuid($value, $message = '')` | Check that a string is a valid UUID +`ip($value, $message = '')` | Check that a string is a valid IP (either IPv4 or IPv6) +`ipv4($value, $message = '')` | Check that a string is a valid IPv4 +`ipv6($value, $message = '')` | Check that a string is a valid IPv6 +`email($value, $message = '')` | Check that a string is a valid e-mail address +`notWhitespaceOnly($value, $message = '')` | Check that a string contains at least one non-whitespace character + +### File Assertions + +Method | Description +----------------------------------- | -------------------------------------------------- +`fileExists($value, $message = '')` | Check that a value is an existing path +`file($value, $message = '')` | Check that a value is an existing file +`directory($value, $message = '')` | Check that a value is an existing directory +`readable($value, $message = '')` | Check that a value is a readable path +`writable($value, $message = '')` | Check that a value is a writable path + +### Object Assertions + +Method | Description +----------------------------------------------------- | -------------------------------------------------- +`classExists($value, $message = '')` | Check that a value is an existing class name +`subclassOf($value, $class, $message = '')` | Check that a class is a subclass of another +`interfaceExists($value, $message = '')` | Check that a value is an existing interface name +`implementsInterface($value, $class, $message = '')` | Check that a class implements an interface +`propertyExists($value, $property, $message = '')` | Check that a property exists in a class/object +`propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object +`methodExists($value, $method, $message = '')` | Check that a method exists in a class/object +`methodNotExists($value, $method, $message = '')` | Check that a method does not exist in a class/object + +### Array Assertions + +Method | Description +-------------------------------------------------- | ------------------------------------------------------------------ +`keyExists($array, $key, $message = '')` | Check that a key exists in an array +`keyNotExists($array, $key, $message = '')` | Check that a key does not exist in an array +`validArrayKey($key, $message = '')` | Check that a value is a valid array key (int or string) +`count($array, $number, $message = '')` | Check that an array contains a specific number of elements +`minCount($array, $min, $message = '')` | Check that an array contains at least a certain number of elements +`maxCount($array, $max, $message = '')` | Check that an array contains at most a certain number of elements +`countBetween($array, $min, $max, $message = '')` | Check that an array has a count in the given range +`isList($array, $message = '')` | Check that an array is a non-associative list +`isNonEmptyList($array, $message = '')` | Check that an array is a non-associative list, and not empty +`isMap($array, $message = '')` | Check that an array is associative and has strings as keys +`isNonEmptyMap($array, $message = '')` | Check that an array is associative and has strings as keys, and is not empty + +### Function Assertions + +Method | Description +------------------------------------------- | ----------------------------------------------------------------------------------------------------- +`throws($closure, $class, $message = '')` | Check that a function throws a certain exception. Subclasses of the exception class will be accepted. + +### Collection Assertions + +All of the above assertions can be prefixed with `all*()` to test the contents +of an array or a `\Traversable`: + +```php +Assert::allIsInstanceOf($employees, 'Acme\Employee'); +``` + +### Nullable Assertions + +All of the above assertions can be prefixed with `nullOr*()` to run the +assertion only if it the value is not `null`: + +```php +Assert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s'); +``` + +### Extending Assert + +The `Assert` class comes with a few methods, which can be overridden to change the class behaviour. You can also extend it to +add your own assertions. + +#### Overriding methods + +Overriding the following methods in your assertion class allows you to change the behaviour of the assertions: + +* `public static function __callStatic($name, $arguments)` + * This method is used to 'create' the `nullOr` and `all` versions of the assertions. +* `protected static function valueToString($value)` + * This method is used for error messages, to convert the value to a string value for displaying. You could use this for representing a value object with a `__toString` method for example. +* `protected static function typeToString($value)` + * This method is used for error messages, to convert the a value to a string representing its type. +* `protected static function strlen($value)` + * This method is used to calculate string length for relevant methods, using the `mb_strlen` if available and useful. +* `protected static function reportInvalidArgument($message)` + * This method is called when an assertion fails, with the specified error message. Here you can throw your own exception, or log something. + +## Static analysis support + +Where applicable, assertion functions are annotated to support Psalm's +[Assertion syntax](https://psalm.dev/docs/annotating_code/assertion_syntax/). +A dedicated [PHPStan Plugin](https://github.com/phpstan/phpstan-webmozart-assert) is +required for proper type support. + +Authors +------- + +* [Bernhard Schussek] a.k.a. [@webmozart] +* [The Community Contributors] + +Contribute +---------- + +Contributions to the package are always welcome! + +* Report any bugs or issues you find on the [issue tracker]. +* You can grab the source code at the package's [Git repository]. + +License +------- + +All contents of this package are licensed under the [MIT license]. + +[beberlei/assert]: https://github.com/beberlei/assert +[assert package]: https://github.com/beberlei/assert +[Composer]: https://getcomposer.org +[Bernhard Schussek]: https://webmozarts.com +[The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors +[issue tracker]: https://github.com/webmozart/assert/issues +[Git repository]: https://github.com/webmozart/assert +[@webmozart]: https://twitter.com/webmozart +[MIT license]: LICENSE +[`Assert`]: src/Assert.php diff --git a/vendor/webmozart/assert/composer.json b/vendor/webmozart/assert/composer.json new file mode 100644 index 00000000..a1fddd61 --- /dev/null +++ b/vendor/webmozart/assert/composer.json @@ -0,0 +1,43 @@ +{ + "name": "webmozart\/assert", + "description": "Assertions to validate method input\/output with nice error messages.", + "license": "MIT", + "keywords": [ + "assert", + "check", + "validate" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "require": { + "php": "^7.2 || ^8.0", + "ext-ctype": "*" + }, + "require-dev": { + "phpunit\/phpunit": "^8.5.13" + }, + "conflict": { + "phpstan\/phpstan": "<0.12.20", + "vimeo\/psalm": "<4.6.1 || 4.6.2" + }, + "autoload": { + "psr-4": { + "RuleDocGenerator202403\\Webmozart\\Assert\\": "src\/" + } + }, + "autoload-dev": { + "psr-4": { + "RuleDocGenerator202403\\Webmozart\\Assert\\Tests\\": "tests\/", + "RuleDocGenerator202403\\Webmozart\\Assert\\Bin\\": "bin\/src" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + } +} \ No newline at end of file diff --git a/vendor/webmozart/assert/src/Assert.php b/vendor/webmozart/assert/src/Assert.php new file mode 100644 index 00000000..0fa1db5b --- /dev/null +++ b/vendor/webmozart/assert/src/Assert.php @@ -0,0 +1,1606 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Webmozart\Assert; + +use ArrayAccess; +use BadMethodCallException; +use Closure; +use Countable; +use DateTime; +use DateTimeImmutable; +use Exception; +use ResourceBundle; +use SimpleXMLElement; +use Throwable; +use Traversable; +/** + * Efficient assertions to validate the input/output of your methods. + * + * @since 1.0 + * + * @author Bernhard Schussek + */ +class Assert +{ + use Mixin; + /** + * @psalm-pure + * @psalm-assert string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function string($value, $message = '') + { + if (!\is_string($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a string. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert non-empty-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function stringNotEmpty($value, $message = '') + { + static::string($value, $message); + static::notEq($value, '', $message); + } + /** + * @psalm-pure + * @psalm-assert int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function integer($value, $message = '') + { + if (!\is_int($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an integer. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function integerish($value, $message = '') + { + if (!\is_numeric($value) || $value != (int) $value) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an integerish value. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert positive-int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function positiveInteger($value, $message = '') + { + if (!(\is_int($value) && $value > 0)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a positive integer. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert float $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function float($value, $message = '') + { + if (!\is_float($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a float. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function numeric($value, $message = '') + { + if (!\is_numeric($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a numeric. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert positive-int|0 $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function natural($value, $message = '') + { + if (!\is_int($value) || $value < 0) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-negative integer. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert bool $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function boolean($value, $message = '') + { + if (!\is_bool($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a boolean. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert scalar $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function scalar($value, $message = '') + { + if (!\is_scalar($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a scalar. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert object $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function object($value, $message = '') + { + if (!\is_object($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an object. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert resource $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function resource($value, $type = null, $message = '') + { + if (!\is_resource($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a resource. Got: %s', static::typeToString($value))); + } + if ($type && $type !== \get_resource_type($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a resource of type %2$s. Got: %s', static::typeToString($value), $type)); + } + } + /** + * @psalm-pure + * @psalm-assert callable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isCallable($value, $message = '') + { + if (!\is_callable($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a callable. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert array $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isArray($value, $message = '') + { + if (!\is_array($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an array. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isTraversable($value, $message = '') + { + @\trigger_error(\sprintf('The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', __METHOD__), \E_USER_DEPRECATED); + if (!\is_array($value) && !$value instanceof Traversable) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a traversable. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert array|ArrayAccess $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isArrayAccessible($value, $message = '') + { + if (!\is_array($value) && !$value instanceof ArrayAccess) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an array accessible. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert countable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isCountable($value, $message = '') + { + if (!\is_array($value) && !$value instanceof Countable && !$value instanceof ResourceBundle && !$value instanceof SimpleXMLElement) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a countable. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isIterable($value, $message = '') + { + if (!\is_array($value) && !$value instanceof Traversable) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an iterable. Got: %s', static::typeToString($value))); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isInstanceOf($value, $class, $message = '') + { + if (!$value instanceof $class) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of %2$s. Got: %s', static::typeToString($value), $class)); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert !ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notInstanceOf($value, $class, $message = '') + { + if ($value instanceof $class) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance other than %2$s. Got: %s', static::typeToString($value), $class)); + } + } + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isInstanceOfAny($value, array $classes, $message = '') + { + foreach ($classes as $class) { + if ($value instanceof $class) { + return; + } + } + static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of any of %2$s. Got: %s', static::typeToString($value), \implode(', ', \array_map(array(static::class, 'valueToString'), $classes)))); + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType|class-string $value + * + * @param object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isAOf($value, $class, $message = '') + { + static::string($class, 'Expected class as a string. Got: %s'); + if (!\is_a($value, $class, \is_string($value))) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of this class or to this class among its parents "%2$s". Got: %s', static::valueToString($value), $class)); + } + } + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * @psalm-assert !UnexpectedType $value + * @psalm-assert !class-string $value + * + * @param object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNotA($value, $class, $message = '') + { + static::string($class, 'Expected class as a string. Got: %s'); + if (\is_a($value, $class, \is_string($value))) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of this class or to this class among its parents other than "%2$s". Got: %s', static::valueToString($value), $class)); + } + } + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param object|string $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isAnyOf($value, array $classes, $message = '') + { + foreach ($classes as $class) { + static::string($class, 'Expected class as a string. Got: %s'); + if (\is_a($value, $class, \is_string($value))) { + return; + } + } + static::reportInvalidArgument(\sprintf($message ?: 'Expected an instance of any of this classes or any of those classes among their parents "%2$s". Got: %s', static::valueToString($value), \implode(', ', $classes))); + } + /** + * @psalm-pure + * @psalm-assert empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isEmpty($value, $message = '') + { + if (!empty($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an empty value. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert !empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEmpty($value, $message = '') + { + if (empty($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-empty value. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function null($value, $message = '') + { + if (null !== $value) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected null. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert !null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notNull($value, $message = '') + { + if (null === $value) { + static::reportInvalidArgument($message ?: 'Expected a value other than null.'); + } + } + /** + * @psalm-pure + * @psalm-assert true $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function true($value, $message = '') + { + if (\true !== $value) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be true. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function false($value, $message = '') + { + if (\false !== $value) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be false. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert !false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notFalse($value, $message = '') + { + if (\false === $value) { + static::reportInvalidArgument($message ?: 'Expected a value other than false.'); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ip($value, $message = '') + { + if (\false === \filter_var($value, \FILTER_VALIDATE_IP)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be an IP. Got: %s', static::valueToString($value))); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ipv4($value, $message = '') + { + if (\false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be an IPv4. Got: %s', static::valueToString($value))); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ipv6($value, $message = '') + { + if (\false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be an IPv6. Got: %s', static::valueToString($value))); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function email($value, $message = '') + { + if (\false === \filter_var($value, \FILTER_VALIDATE_EMAIL)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to be a valid e-mail address. Got: %s', static::valueToString($value))); + } + } + /** + * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. + * + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function uniqueValues(array $values, $message = '') + { + $allValues = \count($values); + $uniqueValues = \count(\array_unique($values)); + if ($allValues !== $uniqueValues) { + $difference = $allValues - $uniqueValues; + static::reportInvalidArgument(\sprintf($message ?: 'Expected an array of unique values, but %s of them %s duplicated', $difference, 1 === $difference ? 'is' : 'are')); + } + } + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function eq($value, $expect, $message = '') + { + if ($expect != $value) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($expect))); + } + } + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEq($value, $expect, $message = '') + { + if ($expect == $value) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a different value than %s.', static::valueToString($expect))); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function same($value, $expect, $message = '') + { + if ($expect !== $value) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value identical to %2$s. Got: %s', static::valueToString($value), static::valueToString($expect))); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notSame($value, $expect, $message = '') + { + if ($expect === $value) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not identical to %s.', static::valueToString($expect))); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function greaterThan($value, $limit, $message = '') + { + if ($value <= $limit) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value greater than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function greaterThanEq($value, $limit, $message = '') + { + if ($value < $limit) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value greater than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lessThan($value, $limit, $message = '') + { + if ($value >= $limit) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value less than %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lessThanEq($value, $limit, $message = '') + { + if ($value > $limit) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value less than or equal to %2$s. Got: %s', static::valueToString($value), static::valueToString($limit))); + } + } + /** + * Inclusive range, so Assert::(3, 3, 5) passes. + * + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function range($value, $min, $max, $message = '') + { + if ($value < $min || $value > $max) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value between %2$s and %3$s. Got: %s', static::valueToString($value), static::valueToString($min), static::valueToString($max))); + } + } + /** + * A more human-readable alias of Assert::inArray(). + * + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function oneOf($value, array $values, $message = '') + { + static::inArray($value, $values, $message); + } + /** + * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. + * + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function inArray($value, array $values, $message = '') + { + if (!\in_array($value, $values, \true)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected one of: %2$s. Got: %s', static::valueToString($value), \implode(', ', \array_map(array(static::class, 'valueToString'), $values)))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function contains($value, $subString, $message = '') + { + if (\false === \strpos($value, $subString)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain %2$s. Got: %s', static::valueToString($value), static::valueToString($subString))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notContains($value, $subString, $message = '') + { + if (\false !== \strpos($value, $subString)) { + static::reportInvalidArgument(\sprintf($message ?: '%2$s was not expected to be contained in a value. Got: %s', static::valueToString($value), static::valueToString($subString))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notWhitespaceOnly($value, $message = '') + { + if (\preg_match('/^\\s*$/', $value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a non-whitespace string. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function startsWith($value, $prefix, $message = '') + { + if (0 !== \strpos($value, $prefix)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notStartsWith($value, $prefix, $message = '') + { + if (0 === \strpos($value, $prefix)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not to start with %2$s. Got: %s', static::valueToString($value), static::valueToString($prefix))); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function startsWithLetter($value, $message = '') + { + static::string($value); + $valid = isset($value[0]); + if ($valid) { + $locale = \setlocale(\LC_CTYPE, 0); + \setlocale(\LC_CTYPE, 'C'); + $valid = \ctype_alpha($value[0]); + \setlocale(\LC_CTYPE, $locale); + } + if (!$valid) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to start with a letter. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function endsWith($value, $suffix, $message = '') + { + if ($suffix !== \substr($value, -\strlen($suffix))) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to end with %2$s. Got: %s', static::valueToString($value), static::valueToString($suffix))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEndsWith($value, $suffix, $message = '') + { + if ($suffix === \substr($value, -\strlen($suffix))) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value not to end with %2$s. Got: %s', static::valueToString($value), static::valueToString($suffix))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function regex($value, $pattern, $message = '') + { + if (!\preg_match($pattern, $value)) { + static::reportInvalidArgument(\sprintf($message ?: 'The value %s does not match the expected pattern.', static::valueToString($value))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notRegex($value, $pattern, $message = '') + { + if (\preg_match($pattern, $value, $matches, \PREG_OFFSET_CAPTURE)) { + static::reportInvalidArgument(\sprintf($message ?: 'The value %s matches the pattern %s (at offset %d).', static::valueToString($value), static::valueToString($pattern), $matches[0][1])); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function unicodeLetters($value, $message = '') + { + static::string($value); + if (!\preg_match('/^\\p{L}+$/u', $value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain only Unicode letters. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function alpha($value, $message = '') + { + static::string($value); + $locale = \setlocale(\LC_CTYPE, 0); + \setlocale(\LC_CTYPE, 'C'); + $valid = !\ctype_alpha($value); + \setlocale(\LC_CTYPE, $locale); + if ($valid) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain only letters. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function digits($value, $message = '') + { + $locale = \setlocale(\LC_CTYPE, 0); + \setlocale(\LC_CTYPE, 'C'); + $valid = !\ctype_digit($value); + \setlocale(\LC_CTYPE, $locale); + if ($valid) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain digits only. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function alnum($value, $message = '') + { + $locale = \setlocale(\LC_CTYPE, 0); + \setlocale(\LC_CTYPE, 'C'); + $valid = !\ctype_alnum($value); + \setlocale(\LC_CTYPE, $locale); + if ($valid) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain letters and digits only. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert lowercase-string $value + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lower($value, $message = '') + { + $locale = \setlocale(\LC_CTYPE, 0); + \setlocale(\LC_CTYPE, 'C'); + $valid = !\ctype_lower($value); + \setlocale(\LC_CTYPE, $locale); + if ($valid) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain lowercase characters only. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-assert !lowercase-string $value + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function upper($value, $message = '') + { + $locale = \setlocale(\LC_CTYPE, 0); + \setlocale(\LC_CTYPE, 'C'); + $valid = !\ctype_upper($value); + \setlocale(\LC_CTYPE, $locale); + if ($valid) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain uppercase characters only. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * + * @param string $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function length($value, $length, $message = '') + { + if ($length !== static::strlen($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain %2$s characters. Got: %s', static::valueToString($value), $length)); + } + } + /** + * Inclusive min. + * + * @psalm-pure + * + * @param string $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function minLength($value, $min, $message = '') + { + if (static::strlen($value) < $min) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain at least %2$s characters. Got: %s', static::valueToString($value), $min)); + } + } + /** + * Inclusive max. + * + * @psalm-pure + * + * @param string $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function maxLength($value, $max, $message = '') + { + if (static::strlen($value) > $max) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain at most %2$s characters. Got: %s', static::valueToString($value), $max)); + } + } + /** + * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. + * + * @psalm-pure + * + * @param string $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lengthBetween($value, $min, $max, $message = '') + { + $length = static::strlen($value); + if ($length < $min || $length > $max) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', static::valueToString($value), $min, $max)); + } + } + /** + * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function fileExists($value, $message = '') + { + static::string($value); + if (!\file_exists($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'The file %s does not exist.', static::valueToString($value))); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function file($value, $message = '') + { + static::fileExists($value, $message); + if (!\is_file($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not a file.', static::valueToString($value))); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function directory($value, $message = '') + { + static::fileExists($value, $message); + if (!\is_dir($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'The path %s is no directory.', static::valueToString($value))); + } + } + /** + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function readable($value, $message = '') + { + if (!\is_readable($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not readable.', static::valueToString($value))); + } + } + /** + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function writable($value, $message = '') + { + if (!\is_writable($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'The path %s is not writable.', static::valueToString($value))); + } + } + /** + * @psalm-assert class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function classExists($value, $message = '') + { + if (!\class_exists($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an existing class name. Got: %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert class-string|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function subclassOf($value, $class, $message = '') + { + if (!\is_subclass_of($value, $class)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected a sub-class of %2$s. Got: %s', static::valueToString($value), static::valueToString($class))); + } + } + /** + * @psalm-assert class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function interfaceExists($value, $message = '') + { + if (!\interface_exists($value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an existing interface name. got %s', static::valueToString($value))); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert class-string $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function implementsInterface($value, $interface, $message = '') + { + if (!\in_array($interface, \class_implements($value))) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an implementation of %2$s. Got: %s', static::valueToString($value), static::valueToString($interface))); + } + } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function propertyExists($classOrObject, $property, $message = '') + { + if (!\property_exists($classOrObject, $property)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected the property %s to exist.', static::valueToString($property))); + } + } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function propertyNotExists($classOrObject, $property, $message = '') + { + if (\property_exists($classOrObject, $property)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected the property %s to not exist.', static::valueToString($property))); + } + } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function methodExists($classOrObject, $method, $message = '') + { + if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected the method %s to exist.', static::valueToString($method))); + } + } + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function methodNotExists($classOrObject, $method, $message = '') + { + if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected the method %s to not exist.', static::valueToString($method))); + } + } + /** + * @psalm-pure + * + * @param array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function keyExists($array, $key, $message = '') + { + if (!(isset($array[$key]) || \array_key_exists($key, $array))) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected the key %s to exist.', static::valueToString($key))); + } + } + /** + * @psalm-pure + * + * @param array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function keyNotExists($array, $key, $message = '') + { + if (isset($array[$key]) || \array_key_exists($key, $array)) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected the key %s to not exist.', static::valueToString($key))); + } + } + /** + * Checks if a value is a valid array key (int or string). + * + * @psalm-pure + * @psalm-assert array-key $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function validArrayKey($value, $message = '') + { + if (!(\is_int($value) || \is_string($value))) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected string or integer. Got: %s', static::typeToString($value))); + } + } + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function count($array, $number, $message = '') + { + static::eq(\count($array), $number, \sprintf($message ?: 'Expected an array to contain %d elements. Got: %d.', $number, \count($array))); + } + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function minCount($array, $min, $message = '') + { + if (\count($array) < $min) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain at least %2$d elements. Got: %d', \count($array), $min)); + } + } + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function maxCount($array, $max, $message = '') + { + if (\count($array) > $max) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain at most %2$d elements. Got: %d', \count($array), $max)); + } + } + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function countBetween($array, $min, $max, $message = '') + { + $count = \count($array); + if ($count < $min || $count > $max) { + static::reportInvalidArgument(\sprintf($message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', $count, $min, $max)); + } + } + /** + * @psalm-pure + * @psalm-assert list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isList($array, $message = '') + { + if (!\is_array($array)) { + static::reportInvalidArgument($message ?: 'Expected list - non-associative array.'); + } + if ($array === \array_values($array)) { + return; + } + $nextKey = -1; + foreach ($array as $k => $v) { + if ($k !== ++$nextKey) { + static::reportInvalidArgument($message ?: 'Expected list - non-associative array.'); + } + } + } + /** + * @psalm-pure + * @psalm-assert non-empty-list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNonEmptyList($array, $message = '') + { + static::isList($array, $message); + static::notEmpty($array, $message); + } + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array $array + * @psalm-assert array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isMap($array, $message = '') + { + if (!\is_array($array) || \array_keys($array) !== \array_filter(\array_keys($array), '\\is_string')) { + static::reportInvalidArgument($message ?: 'Expected map - associative array with string keys.'); + } + } + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array $array + * @psalm-assert array $array + * @psalm-assert !empty $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNonEmptyMap($array, $message = '') + { + static::isMap($array, $message); + static::notEmpty($array, $message); + } + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function uuid($value, $message = '') + { + $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); + // The nil UUID is special form of UUID that is specified to have all + // 128 bits set to zero. + if ('00000000-0000-0000-0000-000000000000' === $value) { + return; + } + if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { + static::reportInvalidArgument(\sprintf($message ?: 'Value %s is not a valid UUID.', static::valueToString($value))); + } + } + /** + * @psalm-param class-string $class + * + * @param Closure $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function throws(Closure $expression, $class = 'Exception', $message = '') + { + static::string($class); + $actual = 'none'; + try { + $expression(); + } catch (Exception $e) { + $actual = \get_class($e); + if ($e instanceof $class) { + return; + } + } catch (Throwable $e) { + $actual = \get_class($e); + if ($e instanceof $class) { + return; + } + } + static::reportInvalidArgument($message ?: \sprintf('Expected to throw "%s", got "%s"', $class, $actual)); + } + /** + * @throws BadMethodCallException + */ + public static function __callStatic($name, $arguments) + { + if ('nullOr' === \substr($name, 0, 6)) { + if (null !== $arguments[0]) { + $method = \lcfirst(\substr($name, 6)); + \call_user_func_array(array(static::class, $method), $arguments); + } + return; + } + if ('all' === \substr($name, 0, 3)) { + static::isIterable($arguments[0]); + $method = \lcfirst(\substr($name, 3)); + $args = $arguments; + foreach ($arguments[0] as $entry) { + $args[0] = $entry; + \call_user_func_array(array(static::class, $method), $args); + } + return; + } + throw new BadMethodCallException('No such method: ' . $name); + } + /** + * @param mixed $value + * + * @return string + */ + protected static function valueToString($value) + { + if (null === $value) { + return 'null'; + } + if (\true === $value) { + return 'true'; + } + if (\false === $value) { + return 'false'; + } + if (\is_array($value)) { + return 'array'; + } + if (\is_object($value)) { + if (\method_exists($value, '__toString')) { + return \get_class($value) . ': ' . self::valueToString($value->__toString()); + } + if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { + return \get_class($value) . ': ' . self::valueToString($value->format('c')); + } + return \get_class($value); + } + if (\is_resource($value)) { + return 'resource'; + } + if (\is_string($value)) { + return '"' . $value . '"'; + } + return (string) $value; + } + /** + * @param mixed $value + * + * @return string + */ + protected static function typeToString($value) + { + return \is_object($value) ? \get_class($value) : \gettype($value); + } + protected static function strlen($value) + { + if (!\function_exists('mb_detect_encoding')) { + return \strlen($value); + } + if (\false === ($encoding = \mb_detect_encoding($value))) { + return \strlen($value); + } + return \mb_strlen($value, $encoding); + } + /** + * @param string $message + * + * @throws InvalidArgumentException + * + * @psalm-pure this method is not supposed to perform side-effects + * @psalm-return never + */ + protected static function reportInvalidArgument($message) + { + throw new InvalidArgumentException($message); + } + private function __construct() + { + } +} diff --git a/vendor/webmozart/assert/src/InvalidArgumentException.php b/vendor/webmozart/assert/src/InvalidArgumentException.php new file mode 100644 index 00000000..b01d882d --- /dev/null +++ b/vendor/webmozart/assert/src/InvalidArgumentException.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace RuleDocGenerator202403\Webmozart\Assert; + +class InvalidArgumentException extends \InvalidArgumentException +{ +} diff --git a/vendor/webmozart/assert/src/Mixin.php b/vendor/webmozart/assert/src/Mixin.php new file mode 100644 index 00000000..7c9d6608 --- /dev/null +++ b/vendor/webmozart/assert/src/Mixin.php @@ -0,0 +1,4630 @@ + $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allString($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::string($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrString($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::string($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert non-empty-string|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrStringNotEmpty($value, $message = '') + { + null === $value || static::stringNotEmpty($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allStringNotEmpty($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::stringNotEmpty($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrStringNotEmpty($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::stringNotEmpty($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert int|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrInteger($value, $message = '') + { + null === $value || static::integer($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allInteger($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::integer($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrInteger($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::integer($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert numeric|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIntegerish($value, $message = '') + { + null === $value || static::integerish($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIntegerish($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::integerish($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIntegerish($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::integerish($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert positive-int|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrPositiveInteger($value, $message = '') + { + null === $value || static::positiveInteger($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allPositiveInteger($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::positiveInteger($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrPositiveInteger($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::positiveInteger($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert float|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrFloat($value, $message = '') + { + null === $value || static::float($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allFloat($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::float($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFloat($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::float($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert numeric|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNumeric($value, $message = '') + { + null === $value || static::numeric($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNumeric($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::numeric($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNumeric($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::numeric($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert positive-int|0|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNatural($value, $message = '') + { + null === $value || static::natural($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNatural($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::natural($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNatural($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::natural($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert bool|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrBoolean($value, $message = '') + { + null === $value || static::boolean($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allBoolean($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::boolean($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrBoolean($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::boolean($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert scalar|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrScalar($value, $message = '') + { + null === $value || static::scalar($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allScalar($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::scalar($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrScalar($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::scalar($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert object|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrObject($value, $message = '') + { + null === $value || static::object($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allObject($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::object($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrObject($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::object($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert resource|null $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrResource($value, $type = null, $message = '') + { + null === $value || static::resource($value, $type, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allResource($value, $type = null, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::resource($entry, $type, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrResource($value, $type = null, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::resource($entry, $type, $message); + } + } + /** + * @psalm-pure + * @psalm-assert callable|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsCallable($value, $message = '') + { + null === $value || static::isCallable($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsCallable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isCallable($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsCallable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isCallable($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert array|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsArray($value, $message = '') + { + null === $value || static::isArray($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsArray($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isArray($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsArray($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isArray($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable|null $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsTraversable($value, $message = '') + { + null === $value || static::isTraversable($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsTraversable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isTraversable($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsTraversable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isTraversable($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert array|ArrayAccess|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsArrayAccessible($value, $message = '') + { + null === $value || static::isArrayAccessible($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsArrayAccessible($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isArrayAccessible($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsArrayAccessible($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isArrayAccessible($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert countable|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsCountable($value, $message = '') + { + null === $value || static::isCountable($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsCountable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isCountable($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsCountable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isCountable($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsIterable($value, $message = '') + { + null === $value || static::isIterable($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsIterable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isIterable($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsIterable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isIterable($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType|null $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsInstanceOf($value, $class, $message = '') + { + null === $value || static::isInstanceOf($value, $class, $message); + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsInstanceOf($value, $class, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isInstanceOf($entry, $class, $message); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsInstanceOf($value, $class, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isInstanceOf($entry, $class, $message); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotInstanceOf($value, $class, $message = '') + { + null === $value || static::notInstanceOf($value, $class, $message); + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotInstanceOf($value, $class, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notInstanceOf($entry, $class, $message); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotInstanceOf($value, $class, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::notInstanceOf($entry, $class, $message); + } + } + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsInstanceOfAny($value, $classes, $message = '') + { + null === $value || static::isInstanceOfAny($value, $classes, $message); + } + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsInstanceOfAny($value, $classes, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isInstanceOfAny($entry, $classes, $message); + } + } + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsInstanceOfAny($value, $classes, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isInstanceOfAny($entry, $classes, $message); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType|class-string|null $value + * + * @param object|string|null $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsAOf($value, $class, $message = '') + { + null === $value || static::isAOf($value, $class, $message); + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable> $value + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsAOf($value, $class, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isAOf($entry, $class, $message); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable|null> $value + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsAOf($value, $class, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isAOf($entry, $class, $message); + } + } + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * + * @param object|string|null $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsNotA($value, $class, $message = '') + { + null === $value || static::isNotA($value, $class, $message); + } + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsNotA($value, $class, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isNotA($entry, $class, $message); + } + } + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * @psalm-assert iterable|null> $value + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsNotA($value, $class, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isNotA($entry, $class, $message); + } + } + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param object|string|null $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsAnyOf($value, $classes, $message = '') + { + null === $value || static::isAnyOf($value, $classes, $message); + } + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param iterable $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsAnyOf($value, $classes, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isAnyOf($entry, $classes, $message); + } + } + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param iterable $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsAnyOf($value, $classes, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isAnyOf($entry, $classes, $message); + } + } + /** + * @psalm-pure + * @psalm-assert empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsEmpty($value, $message = '') + { + null === $value || static::isEmpty($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsEmpty($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::isEmpty($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsEmpty($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::isEmpty($entry, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotEmpty($value, $message = '') + { + null === $value || static::notEmpty($value, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotEmpty($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notEmpty($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotEmpty($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::notEmpty($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNull($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::null($entry, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotNull($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notNull($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert true|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrTrue($value, $message = '') + { + null === $value || static::true($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allTrue($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::true($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrTrue($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::true($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert false|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrFalse($value, $message = '') + { + null === $value || static::false($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allFalse($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::false($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFalse($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::false($entry, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotFalse($value, $message = '') + { + null === $value || static::notFalse($value, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotFalse($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notFalse($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotFalse($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::notFalse($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIp($value, $message = '') + { + null === $value || static::ip($value, $message); + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIp($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::ip($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIp($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::ip($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIpv4($value, $message = '') + { + null === $value || static::ipv4($value, $message); + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIpv4($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::ipv4($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIpv4($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::ipv4($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIpv6($value, $message = '') + { + null === $value || static::ipv6($value, $message); + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIpv6($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::ipv6($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIpv6($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::ipv6($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrEmail($value, $message = '') + { + null === $value || static::email($value, $message); + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allEmail($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::email($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrEmail($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::email($entry, $message); + } + } + /** + * @param array|null $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrUniqueValues($values, $message = '') + { + null === $values || static::uniqueValues($values, $message); + } + /** + * @param iterable $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allUniqueValues($values, $message = '') + { + static::isIterable($values); + foreach ($values as $entry) { + static::uniqueValues($entry, $message); + } + } + /** + * @param iterable $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUniqueValues($values, $message = '') + { + static::isIterable($values); + foreach ($values as $entry) { + null === $entry || static::uniqueValues($entry, $message); + } + } + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrEq($value, $expect, $message = '') + { + null === $value || static::eq($value, $expect, $message); + } + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allEq($value, $expect, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::eq($entry, $expect, $message); + } + } + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrEq($value, $expect, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::eq($entry, $expect, $message); + } + } + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotEq($value, $expect, $message = '') + { + null === $value || static::notEq($value, $expect, $message); + } + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotEq($value, $expect, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notEq($entry, $expect, $message); + } + } + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotEq($value, $expect, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::notEq($entry, $expect, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrSame($value, $expect, $message = '') + { + null === $value || static::same($value, $expect, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allSame($value, $expect, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::same($entry, $expect, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrSame($value, $expect, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::same($entry, $expect, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotSame($value, $expect, $message = '') + { + null === $value || static::notSame($value, $expect, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotSame($value, $expect, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notSame($entry, $expect, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotSame($value, $expect, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::notSame($entry, $expect, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrGreaterThan($value, $limit, $message = '') + { + null === $value || static::greaterThan($value, $limit, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allGreaterThan($value, $limit, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::greaterThan($entry, $limit, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrGreaterThan($value, $limit, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::greaterThan($entry, $limit, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrGreaterThanEq($value, $limit, $message = '') + { + null === $value || static::greaterThanEq($value, $limit, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allGreaterThanEq($value, $limit, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::greaterThanEq($entry, $limit, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrGreaterThanEq($value, $limit, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::greaterThanEq($entry, $limit, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrLessThan($value, $limit, $message = '') + { + null === $value || static::lessThan($value, $limit, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allLessThan($value, $limit, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::lessThan($entry, $limit, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLessThan($value, $limit, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::lessThan($entry, $limit, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrLessThanEq($value, $limit, $message = '') + { + null === $value || static::lessThanEq($value, $limit, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allLessThanEq($value, $limit, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::lessThanEq($entry, $limit, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLessThanEq($value, $limit, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::lessThanEq($entry, $limit, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrRange($value, $min, $max, $message = '') + { + null === $value || static::range($value, $min, $max, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allRange($value, $min, $max, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::range($entry, $min, $max, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrRange($value, $min, $max, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::range($entry, $min, $max, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrOneOf($value, $values, $message = '') + { + null === $value || static::oneOf($value, $values, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allOneOf($value, $values, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::oneOf($entry, $values, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrOneOf($value, $values, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::oneOf($entry, $values, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrInArray($value, $values, $message = '') + { + null === $value || static::inArray($value, $values, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allInArray($value, $values, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::inArray($entry, $values, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrInArray($value, $values, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::inArray($entry, $values, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrContains($value, $subString, $message = '') + { + null === $value || static::contains($value, $subString, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allContains($value, $subString, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::contains($entry, $subString, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrContains($value, $subString, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::contains($entry, $subString, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotContains($value, $subString, $message = '') + { + null === $value || static::notContains($value, $subString, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotContains($value, $subString, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notContains($entry, $subString, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotContains($value, $subString, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::notContains($entry, $subString, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotWhitespaceOnly($value, $message = '') + { + null === $value || static::notWhitespaceOnly($value, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotWhitespaceOnly($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notWhitespaceOnly($entry, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotWhitespaceOnly($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::notWhitespaceOnly($entry, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrStartsWith($value, $prefix, $message = '') + { + null === $value || static::startsWith($value, $prefix, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allStartsWith($value, $prefix, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::startsWith($entry, $prefix, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrStartsWith($value, $prefix, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::startsWith($entry, $prefix, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotStartsWith($value, $prefix, $message = '') + { + null === $value || static::notStartsWith($value, $prefix, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotStartsWith($value, $prefix, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notStartsWith($entry, $prefix, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotStartsWith($value, $prefix, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::notStartsWith($entry, $prefix, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrStartsWithLetter($value, $message = '') + { + null === $value || static::startsWithLetter($value, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allStartsWithLetter($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::startsWithLetter($entry, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrStartsWithLetter($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::startsWithLetter($entry, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrEndsWith($value, $suffix, $message = '') + { + null === $value || static::endsWith($value, $suffix, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allEndsWith($value, $suffix, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::endsWith($entry, $suffix, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrEndsWith($value, $suffix, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::endsWith($entry, $suffix, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotEndsWith($value, $suffix, $message = '') + { + null === $value || static::notEndsWith($value, $suffix, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotEndsWith($value, $suffix, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notEndsWith($entry, $suffix, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotEndsWith($value, $suffix, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::notEndsWith($entry, $suffix, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrRegex($value, $pattern, $message = '') + { + null === $value || static::regex($value, $pattern, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allRegex($value, $pattern, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::regex($entry, $pattern, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrRegex($value, $pattern, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::regex($entry, $pattern, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrNotRegex($value, $pattern, $message = '') + { + null === $value || static::notRegex($value, $pattern, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNotRegex($value, $pattern, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::notRegex($entry, $pattern, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotRegex($value, $pattern, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::notRegex($entry, $pattern, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrUnicodeLetters($value, $message = '') + { + null === $value || static::unicodeLetters($value, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allUnicodeLetters($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::unicodeLetters($entry, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUnicodeLetters($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::unicodeLetters($entry, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrAlpha($value, $message = '') + { + null === $value || static::alpha($value, $message); + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allAlpha($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::alpha($entry, $message); + } + } + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrAlpha($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::alpha($entry, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrDigits($value, $message = '') + { + null === $value || static::digits($value, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allDigits($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::digits($entry, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrDigits($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::digits($entry, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrAlnum($value, $message = '') + { + null === $value || static::alnum($value, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allAlnum($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::alnum($entry, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrAlnum($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::alnum($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert lowercase-string|null $value + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrLower($value, $message = '') + { + null === $value || static::lower($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allLower($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::lower($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLower($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::lower($entry, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrUpper($value, $message = '') + { + null === $value || static::upper($value, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allUpper($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::upper($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUpper($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::upper($entry, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrLength($value, $length, $message = '') + { + null === $value || static::length($value, $length, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allLength($value, $length, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::length($entry, $length, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLength($value, $length, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::length($entry, $length, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMinLength($value, $min, $message = '') + { + null === $value || static::minLength($value, $min, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMinLength($value, $min, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::minLength($entry, $min, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMinLength($value, $min, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::minLength($entry, $min, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMaxLength($value, $max, $message = '') + { + null === $value || static::maxLength($value, $max, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMaxLength($value, $max, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::maxLength($entry, $max, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMaxLength($value, $max, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::maxLength($entry, $max, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrLengthBetween($value, $min, $max, $message = '') + { + null === $value || static::lengthBetween($value, $min, $max, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allLengthBetween($value, $min, $max, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::lengthBetween($entry, $min, $max, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLengthBetween($value, $min, $max, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::lengthBetween($entry, $min, $max, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrFileExists($value, $message = '') + { + null === $value || static::fileExists($value, $message); + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allFileExists($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::fileExists($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFileExists($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::fileExists($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrFile($value, $message = '') + { + null === $value || static::file($value, $message); + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allFile($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::file($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFile($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::file($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrDirectory($value, $message = '') + { + null === $value || static::directory($value, $message); + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allDirectory($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::directory($entry, $message); + } + } + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrDirectory($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::directory($entry, $message); + } + } + /** + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrReadable($value, $message = '') + { + null === $value || static::readable($value, $message); + } + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allReadable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::readable($entry, $message); + } + } + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrReadable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::readable($entry, $message); + } + } + /** + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrWritable($value, $message = '') + { + null === $value || static::writable($value, $message); + } + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allWritable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::writable($entry, $message); + } + } + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrWritable($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::writable($entry, $message); + } + } + /** + * @psalm-assert class-string|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrClassExists($value, $message = '') + { + null === $value || static::classExists($value, $message); + } + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allClassExists($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::classExists($entry, $message); + } + } + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrClassExists($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::classExists($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert class-string|ExpectedType|null $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrSubclassOf($value, $class, $message = '') + { + null === $value || static::subclassOf($value, $class, $message); + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable|ExpectedType> $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allSubclassOf($value, $class, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::subclassOf($entry, $class, $message); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable|ExpectedType|null> $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrSubclassOf($value, $class, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::subclassOf($entry, $class, $message); + } + } + /** + * @psalm-assert class-string|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrInterfaceExists($value, $message = '') + { + null === $value || static::interfaceExists($value, $message); + } + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allInterfaceExists($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::interfaceExists($entry, $message); + } + } + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrInterfaceExists($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::interfaceExists($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert class-string|null $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrImplementsInterface($value, $interface, $message = '') + { + null === $value || static::implementsInterface($value, $interface, $message); + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert iterable> $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allImplementsInterface($value, $interface, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::implementsInterface($entry, $interface, $message); + } + } + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert iterable|null> $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrImplementsInterface($value, $interface, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::implementsInterface($entry, $interface, $message); + } + } + /** + * @psalm-pure + * @psalm-param class-string|object|null $classOrObject + * + * @param string|object|null $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrPropertyExists($classOrObject, $property, $message = '') + { + null === $classOrObject || static::propertyExists($classOrObject, $property, $message); + } + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allPropertyExists($classOrObject, $property, $message = '') + { + static::isIterable($classOrObject); + foreach ($classOrObject as $entry) { + static::propertyExists($entry, $property, $message); + } + } + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrPropertyExists($classOrObject, $property, $message = '') + { + static::isIterable($classOrObject); + foreach ($classOrObject as $entry) { + null === $entry || static::propertyExists($entry, $property, $message); + } + } + /** + * @psalm-pure + * @psalm-param class-string|object|null $classOrObject + * + * @param string|object|null $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrPropertyNotExists($classOrObject, $property, $message = '') + { + null === $classOrObject || static::propertyNotExists($classOrObject, $property, $message); + } + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allPropertyNotExists($classOrObject, $property, $message = '') + { + static::isIterable($classOrObject); + foreach ($classOrObject as $entry) { + static::propertyNotExists($entry, $property, $message); + } + } + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrPropertyNotExists($classOrObject, $property, $message = '') + { + static::isIterable($classOrObject); + foreach ($classOrObject as $entry) { + null === $entry || static::propertyNotExists($entry, $property, $message); + } + } + /** + * @psalm-pure + * @psalm-param class-string|object|null $classOrObject + * + * @param string|object|null $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMethodExists($classOrObject, $method, $message = '') + { + null === $classOrObject || static::methodExists($classOrObject, $method, $message); + } + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMethodExists($classOrObject, $method, $message = '') + { + static::isIterable($classOrObject); + foreach ($classOrObject as $entry) { + static::methodExists($entry, $method, $message); + } + } + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMethodExists($classOrObject, $method, $message = '') + { + static::isIterable($classOrObject); + foreach ($classOrObject as $entry) { + null === $entry || static::methodExists($entry, $method, $message); + } + } + /** + * @psalm-pure + * @psalm-param class-string|object|null $classOrObject + * + * @param string|object|null $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMethodNotExists($classOrObject, $method, $message = '') + { + null === $classOrObject || static::methodNotExists($classOrObject, $method, $message); + } + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMethodNotExists($classOrObject, $method, $message = '') + { + static::isIterable($classOrObject); + foreach ($classOrObject as $entry) { + static::methodNotExists($entry, $method, $message); + } + } + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMethodNotExists($classOrObject, $method, $message = '') + { + static::isIterable($classOrObject); + foreach ($classOrObject as $entry) { + null === $entry || static::methodNotExists($entry, $method, $message); + } + } + /** + * @psalm-pure + * + * @param array|null $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrKeyExists($array, $key, $message = '') + { + null === $array || static::keyExists($array, $key, $message); + } + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allKeyExists($array, $key, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + static::keyExists($entry, $key, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrKeyExists($array, $key, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + null === $entry || static::keyExists($entry, $key, $message); + } + } + /** + * @psalm-pure + * + * @param array|null $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrKeyNotExists($array, $key, $message = '') + { + null === $array || static::keyNotExists($array, $key, $message); + } + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allKeyNotExists($array, $key, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + static::keyNotExists($entry, $key, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrKeyNotExists($array, $key, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + null === $entry || static::keyNotExists($entry, $key, $message); + } + } + /** + * @psalm-pure + * @psalm-assert array-key|null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrValidArrayKey($value, $message = '') + { + null === $value || static::validArrayKey($value, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allValidArrayKey($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::validArrayKey($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrValidArrayKey($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::validArrayKey($entry, $message); + } + } + /** + * @param Countable|array|null $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrCount($array, $number, $message = '') + { + null === $array || static::count($array, $number, $message); + } + /** + * @param iterable $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allCount($array, $number, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + static::count($entry, $number, $message); + } + } + /** + * @param iterable $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrCount($array, $number, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + null === $entry || static::count($entry, $number, $message); + } + } + /** + * @param Countable|array|null $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMinCount($array, $min, $message = '') + { + null === $array || static::minCount($array, $min, $message); + } + /** + * @param iterable $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMinCount($array, $min, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + static::minCount($entry, $min, $message); + } + } + /** + * @param iterable $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMinCount($array, $min, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + null === $entry || static::minCount($entry, $min, $message); + } + } + /** + * @param Countable|array|null $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrMaxCount($array, $max, $message = '') + { + null === $array || static::maxCount($array, $max, $message); + } + /** + * @param iterable $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allMaxCount($array, $max, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + static::maxCount($entry, $max, $message); + } + } + /** + * @param iterable $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMaxCount($array, $max, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + null === $entry || static::maxCount($entry, $max, $message); + } + } + /** + * @param Countable|array|null $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrCountBetween($array, $min, $max, $message = '') + { + null === $array || static::countBetween($array, $min, $max, $message); + } + /** + * @param iterable $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allCountBetween($array, $min, $max, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + static::countBetween($entry, $min, $max, $message); + } + } + /** + * @param iterable $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrCountBetween($array, $min, $max, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + null === $entry || static::countBetween($entry, $min, $max, $message); + } + } + /** + * @psalm-pure + * @psalm-assert list|null $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsList($array, $message = '') + { + null === $array || static::isList($array, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsList($array, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + static::isList($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsList($array, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + null === $entry || static::isList($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert non-empty-list|null $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsNonEmptyList($array, $message = '') + { + null === $array || static::isNonEmptyList($array, $message); + } + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsNonEmptyList($array, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + static::isNonEmptyList($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsNonEmptyList($array, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + null === $entry || static::isNonEmptyList($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array|null $array + * @psalm-assert array|null $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsMap($array, $message = '') + { + null === $array || static::isMap($array, $message); + } + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable> $array + * @psalm-assert iterable> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsMap($array, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + static::isMap($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable|null> $array + * @psalm-assert iterable|null> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsMap($array, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + null === $entry || static::isMap($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array|null $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrIsNonEmptyMap($array, $message = '') + { + null === $array || static::isNonEmptyMap($array, $message); + } + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allIsNonEmptyMap($array, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + static::isNonEmptyMap($entry, $message); + } + } + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable|null> $array + * @psalm-assert iterable|null> $array + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsNonEmptyMap($array, $message = '') + { + static::isIterable($array); + foreach ($array as $entry) { + null === $entry || static::isNonEmptyMap($entry, $message); + } + } + /** + * @psalm-pure + * + * @param string|null $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrUuid($value, $message = '') + { + null === $value || static::uuid($value, $message); + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allUuid($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + static::uuid($entry, $message); + } + } + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUuid($value, $message = '') + { + static::isIterable($value); + foreach ($value as $entry) { + null === $entry || static::uuid($entry, $message); + } + } + /** + * @psalm-param class-string $class + * + * @param Closure|null $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function nullOrThrows($expression, $class = 'Exception', $message = '') + { + null === $expression || static::throws($expression, $class, $message); + } + /** + * @psalm-param class-string $class + * + * @param iterable $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allThrows($expression, $class = 'Exception', $message = '') + { + static::isIterable($expression); + foreach ($expression as $entry) { + static::throws($entry, $class, $message); + } + } + /** + * @psalm-param class-string $class + * + * @param iterable $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrThrows($expression, $class = 'Exception', $message = '') + { + static::isIterable($expression); + foreach ($expression as $entry) { + null === $entry || static::throws($entry, $class, $message); + } + } +}

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⁢&*CI?CvyBiftRA|-Jv1&=E9dPUi6Jv+ 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

#6D#@Amfo@Nj2rK`9vemV?bNd4V|@7ma2X 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೑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 z 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